239. Sliding Window Maximum

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

Вам дан 배열 целых чисел nums. Существует скользящее окно размера k, которое перемещается с самого левого конца 배열а до самого правого. Вы можете видеть только k чисел в окне. Каждый раз скользящее окно перемещается вправо на одну позицию.

return максимальные значения скользящего окна.

예제

Input: nums = [1], k = 1

Output: [1]

C# 해법

매칭됨/원본
public class Solution {
    public int[] MaxSlidingWindow(int[] nums, int k) {
        LinkedList<int> dq = new LinkedList<int>();
        List<int> res = new List<int>();
        for (int i = 0; i < k; i++) {
            while (dq.Count != 0 && nums[i] >= nums[dq.Last.Value]) {
                dq.RemoveLast();
            }
            dq.AddLast(i);
        }
        res.Add(nums[dq.First.Value]);
        for (int i = k; i < nums.Length; i++) {
            if (dq.First.Value == i - k) {
                dq.RemoveFirst();
            }
            while (dq.Count != 0 && nums[i] >= nums[dq.Last.Value]) {
                dq.RemoveLast();
            }
            dq.AddLast(i);
            res.Add(nums[dq.First.Value]);
        }
        return res.ToArray();
    }
}

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>& MaxSlidingWindow(vector<int>& nums, int k) {
        LinkedList<int> dq = new LinkedList<int>();
        List<int> res = new List<int>();
        for (int i = 0; i < k; i++) {
            while (dq.size() != 0 && nums[i] >= nums[dq.Last.Value]) {
                dq.RemoveLast();
            }
            dq.AddLast(i);
        }
        res.push_back(nums[dq.First.Value]);
        for (int i = k; i < nums.size(); i++) {
            if (dq.First.Value == i - k) {
                dq.RemoveFirst();
            }
            while (dq.size() != 0 && nums[i] >= nums[dq.Last.Value]) {
                dq.RemoveLast();
            }
            dq.AddLast(i);
            res.push_back(nums[dq.First.Value]);
        }
        return res.ToArray();
    }
}

Java 해법

매칭됨/원본
class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        Deque<Integer> dq = new LinkedList<>();
        List<Integer> res = new ArrayList<>();

        for (int i = 0; i < k; i++) {
            while (!dq.isEmpty() && nums[i] >= nums[dq.peekLast()]) {
                dq.pollLast();
            }
            dq.offerLast(i);
        }
        res.add(nums[dq.peekFirst()]);

        for (int i = k; i < nums.length; i++) {
            if (dq.peekFirst() == i - k) {
                dq.pollFirst();
            }
            while (!dq.isEmpty() && nums[i] >= nums

JavaScript 해법

매칭됨/원본
class Solution {
    maxSlidingWindow(nums, k) {
        const dq = []
        const res = []

        for (let i = 0; i < k; i++) {
            while (dq.length && nums[i] >= nums[dq[dq.length - 1]]) {
                dq.pop()
            }
            dq.push(i)
        }
        res.push(nums[dq[0]])

        for (let i = k; i < nums.length; i++) {
            if (dq[0] == i - k) {
                dq.shift()
            }
            while (dq.length && nums[i] >= nums[dq[dq.length - 1]]) {
                dq.pop()
            }
            dq.push(i)
            res.push(nums[dq[0]])
        }

        return res
    }
}

Python 해법

매칭됨/원본
class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        dq = collections.deque()
        res = []

        for i in range(k):
            while dq and nums[i] >= nums[dq[-1]]:
                dq.pop()
            dq.append(i)
        res.append(nums[dq[0]])

        for i in range(k, len(nums)):
            if dq[0] == i - k:
                dq.popleft()
            while dq and nums[i] >= nums[dq[-1]]:
                dq.pop()
            dq.append(i)
            res.append(nums[dq[0]])

        return res

Go 해법

매칭됨/원본
func maxSlidingWindow(nums []int, k int) []int {
    dq := make([]int, 0)
    res := make([]int, 0)
    
    for i := 0; i < k; i++ {
        for len(dq) > 0 && nums[i] >= nums[dq[len(dq)-1]] {
            dq = dq[:len(dq)-1]
        }
        dq = append(dq, i)
    }
    res = append(res, nums[dq[0]])
    
    for i := k; i < len(nums); i++ {
        if dq[0] == i - k {
            dq = dq[1:]
        }
        for len(dq) > 0 && nums[i] >= nums[dq[len(dq)-1]] {
            dq = dq[:len(dq)-1]
        }
        dq = append(dq, i)
        res = append(res, nums[dq[0]])
    }
    
    return res
}

Algorithm

Инициализация и заполнение первой части окна:

Создайте двустороннюю очередь dq для хранения индексов elementов и список res для хранения результатов.

Пройдите по первым k elementам 배열а nums (от i = 0 до k - 1). Для каждого elementа:

Удалите из dq все elementы, которые меньше или равны текущему elementу nums[i].

Добавьте текущий индекс i в конец dq.

Добавьте в res maximum element первого окна, который находится в nums[dq[0]].

Сканирование оставшейся части 배열а:

Пройдите по оставшимся elementам 배열а nums (от i = k до n - 1). Для каждого elementа:

Если индекс elementа на передней части dq равен i - k, удалите этот element из dq, так как он 출력ит за пределы текущего окна.

Удалите из dq все elementы, которые меньше или равны текущему elementу nums[i].

Добавьте текущий индекс i в конец dq.

Добавьте в res maximum element текущего окна, который находится в nums[dq[0]].

Возвращение результата:

return список res, содержащий максимальные elementы для каждого скользящего окна.

😎

Vacancies for this task

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

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