Leetcode239. 최대 슬라이딩 윈도우

제목 설명

배열 nums 주어 K의 사이즈는 어레이로 배열 좌측의 윈도우 이동을 슬라이딩 우측있다. 당신은 슬라이딩 윈도우에 K 숫자를 볼 수 있습니다. 오른쪽 하나에 윈도우가 이동 슬라이딩 시간.

슬라이딩 윈도우의 최대 값을 반환합니다.

예 :

입력 : nums = [1,3, -1, -3,5,3,6,7, 및 K = 3
출력 [3,3,5,5,6,7]
설명 :

슬라이딩 윈도우의 최대 위치
--------------- -----
[-1. 3. 1] -3-. 5. 제 3 맥스. :. 3 7
. 1. 3 -3 -1]. (5) MAX. 6. 제 3 :. 3
1 3 -3 -1 5.] (3) 최대 6.7 :. 5...
(1) (3) -1 최대 6.7 :. 5. -3 3.5.].
1. 3 -1 -3 최대 7. 3. 5.6.]. : . (6)
. 제 1 3 -3 -1 [. 3. 제 7 최대 7 :.

문제 해결

주요 질문은 고전적인 제목의 양단 및 동적 프로그래밍을 연구하는 데 사용됩니다. 일시적으로 최초의 솔루션 양단 큐 감동. 보충 규정을 수행하는 이동 한 후 (?)

폭력 (자바)

아이디어 : 다음과 같은.


class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if (nums.length == 0 || k == 0) return new int[0];
        int[] ans = new int[nums.length - k + 1];
        int[] tmp = new int[k];
        for ( int i = 0; i < nums.length - k + 1; i++) {
            // 更新tmp
            int index = 0; 
            for ( int j = i; j < i + k; j ++) {
                tmp[index++] = nums[j]; 
            }
            // 找tmp里的最大值
            Arrays.sort(tmp);
            // 将最大值保存在ans里
            ans[i] = tmp[k-1];
        } 
        return ans;
    }
}

복잡도 분석

  • 시간 복잡도 : O ( * 케이 N * K )
  • 공간 복잡도 : O (N)

양단 큐 (자바)

사상 : 양단 데이터 구조, 즉 양면에 직접 동작 할 수있다. 양단 가장 흔한 위치는 동적 윈도우 길이 또는 연속성을 달성하기 위해, 그리고 동적 윈도우는 문제를 많이 사용 이러한 데이터 구조를 갖는다.

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if(nums == null || nums.length < 2) return nums;
        // 双向队列 保存当前窗口最大值的数组位置 保证队列中数组位置的数值按从大到小排序
        LinkedList<Integer> queue = new LinkedList();
        // 结果数组
        int[] result = new int[nums.length-k+1];
        // 遍历nums数组
        for(int i = 0;i < nums.length;i++){
            // 保证从大到小 如果前面数小则需要依次弹出,直至满足要求
            while(!queue.isEmpty() && nums[queue.peekLast()] <= nums[i]){
                queue.pollLast();
            }
            // 添加当前值对应的数组下标
            queue.addLast(i);
            // 判断当前队列中队首的值是否有效
            if(queue.peek() <= i-k){
                queue.poll();   
            } 
            // 当窗口长度为k时 保存当前窗口中最大值
            if(i+1 >= k){
                result[i+1-k] = nums[queue.peek()];
            }
        }
        return result;
    }
}
  • 시간 복잡도 : O (N)
  • 공간 복잡도 : O (N)
게시 43 개 원래 기사 · 원의 찬양 (20) · 전망 1452

추천

출처blog.csdn.net/Chen_2018k/article/details/104665759