755. Pour Water

LeetCode medium original: C# #array #csharp #leetcode #medium
선택한 UI 언어에 맞게 문제 텍스트를 러시아어에서 번역합니다. 코드는 변경하지 않습니다.

Вам дана карта высот, представленная в виде целочисленного 배열а heights, где heights[i] - высота местности в точке i. Ширина в каждой точке равна 1. Вам также given два целых числа volume и k. Единицы объема воды будут падать в точке k. Вода сначала падает в точке k и упирается в самую высокую местность или воду в этой точке. Затем она течет по следующим правилам: если капля в конечном итоге упадет, двигаясь влево, то двигайтесь влево. Иначе, если капля в конечном итоге упадет, двигаясь вправо, то двигайтесь вправо. Иначе поднимайтесь в текущее положение. Здесь "в конечном итоге упадет" означает, что капля в конечном итоге окажется на более низком уровне, если она будет двигаться в этом направлении. Кроме того, уровень означает высоту местности плюс вода в этом столбе. Мы можем предположить, что на двух сторонах, 출력ящих за пределы 배열а, есть бесконечно высокая местность. Также не может быть частичного равномерного распределения воды более чем на один блок сетки, и каждая единица воды должна находиться ровно в одном блоке.

예제:

Input: heights = [2,1,1,2,1,2,2], volume = 4, k = 3

Output: [2,2,2,3,2,2,2]

C# 해법

매칭됨/원본
public class Solution {
    public int[] PourWater(int[] heights, int volume, int k) {
        for (int v = 0; v < volume; v++) {
            int dropIndex = k;
            foreach (int d in new int[]{-1, 1}) {
                int i = k;
                while (i + d >= 0 && i + d < heights.Length && heights[i + d] <= heights[i]) {
                    if (heights[i + d] < heights[i]) {
                        dropIndex = i + d;
                    }
                    i += d;
                }
                if (dropIndex != k) break;
            }
            heights[dropIndex]++;
        }
        return heights;
    }
}

C++ 해법

자동 초안, 제출 전 검토
#include <bits/stdc++.h>
using namespace std;

// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
    public vector<int>& PourWater(vector<int>& heights, int volume, int k) {
        for (int v = 0; v < volume; v++) {
            int dropIndex = k;
            foreach (int d in new int[]{-1, 1}) {
                int i = k;
                while (i + d >= 0 && i + d < heights.size() && heights[i + d] <= heights[i]) {
                    if (heights[i + d] < heights[i]) {
                        dropIndex = i + d;
                    }
                    i += d;
                }
                if (dropIndex != k) break;
            }
            heights[dropIndex]++;
        }
        return heights;
    }
}

Java 해법

매칭됨/원본
public class Solution {
    public int[] pourWater(int[] heights, int volume, int k) {
        for (int v = 0; v < volume; v++) {
            int dropIndex = k;
            for (int d : new int[]{-1, 1}) {
                int i = k;
                while (i + d >= 0 && i + d < heights.length && heights[i + d] <= heights[i]) {
                    if (heights[i + d] < heights[i]) {
                        dropIndex = i + d;
                    }
                    i += d;
                }
                if (dropIndex != k) {
                    break;
                }
            }
            heights[dropIndex]++;
        }
        return heights;
    }

JavaScript 해법

매칭됨/원본
function pourWater(heights, volume, k) {
    for (let v = 0; v < volume; v++) {
        let dropIndex = k;
        for (let d of [-1, 1]) {
            let i = k;
            while (i + d >= 0 && i + d < heights.length && heights[i + d] <= heights[i]) {
                if (heights[i + d] < heights[i]) {
                    dropIndex = i + d;
                }
                i += d;
            }
            if (dropIndex != k) {
                break;
            }
        }
        heights[dropIndex]++;
    }
    return heights;
}

Python 해법

매칭됨/원본
def pourWater(heights, volume, k):
    for _ in range(volume):
        drop_index = k
        for d in (-1, 1):
            i = k
            while 0 <= i + d < len(heights) and heights[i + d] <= heights[i]:
                if heights[i + d] < heights[i]:
                    drop_index = i + d
                i += d
            if drop_index != k:
                break
        heights[drop_index] += 1
    return heights

Algorithm

Инициализируйте цикл для добавления объема воды.

Для каждой единицы воды: Проверьте, может ли вода двигаться влево и упасть на более низкий уровень. Если нет, проверьте, может ли вода двигаться вправо и упасть на более низкий уровень. Если нет, добавьте воду в текущую позицию.

Повторите шаг 2, пока не будет добавлен весь объем воды.

😎

Vacancies for this task

활성 채용 with overlapping task tags are 표시됨.

전체 채용
아직 활성 채용이 없습니다.