Leetcode_239_滑动窗口最大值_优先队列

1/2

最后的时间和空间不是很理想
不过这么写的确是最好想的
还是那句话,你管这叫困难?
class Solution {
    
    
    public int[] maxSlidingWindow(int[] nums, int k) {
    
    
        int n = nums.length;
        PriorityQueue<int[]> pq = new PriorityQueue<int[]>(new Comparator<int[]>() {
    
    
            public int compare(int[] pair1, int[] pair2) {
    
    
                return pair1[0] != pair2[0] ? pair2[0] - pair1[0] : pair2[1] - pair1[1];
            }
        });
        for (int i = 0; i < k; ++i) {
    
    
            pq.offer(new int[]{
    
    nums[i], i});
        }
        int[] ans = new int[n - k + 1];
        ans[0] = pq.peek()[0];
        for (int i = k; i < n; ++i) {
    
    
            pq.offer(new int[]{
    
    nums[i], i});
            while (pq.peek()[1] <= i - k) {
    
    
                pq.poll();
            }
            ans[i - k + 1] = pq.peek()[0];
        }
        return ans;
    }
}

下面是一位大佬写的打败了100%的代码

class Solution {
    
    
    public int[] maxSlidingWindow(int[] nums, int k) {
    
    
        int left = 0, right = left + k - 1;
        int[] ans;
        if(k>=nums.length){
    
    
            ans = new int[1];
        }else{
    
    
            ans = new int[nums.length-k+1];
        }
        if(right>nums.length-1){
    
    
            right = nums.length-1;
        }
        int count = 0;
        int index = maxnum(nums,left,right+1);
        ans[count] = nums[index];
        left++;
        right++;
        count++;
        while(right<nums.length){
    
    
            if(left<=index){
    
    
                if(nums[right]>=nums[index]){
    
    
                    index = right;
                    ans[count] = nums[index];
                }else{
    
    
                    ans[count] = nums[index];
                }
            }else{
    
    
                if(nums[left]==nums[index]||nums[left]==nums[index]-1){
    
    
                    index = left;
                    if(nums[right]>nums[index]){
    
    
                        index = right;
                    }
                    ans[count] = nums[index];
                }else{
    
    
                    index = maxnum(nums,left,right+1);
                    ans[count] = nums[index];
                }
            }
            left++; right++; count++;
        }
        return ans;
    }

    private int maxnum(int[] nums, int start, int end){
    
    
        int index = start;
        for(int i=start+1;i<end;i++){
    
    
            if(nums[i]>nums[index]){
    
    
                index = i;
            }
        }
        return index;
    }
    
}

猜你喜欢

转载自blog.csdn.net/HDUCheater/article/details/112094855