1. 程式人生 > >LeetCode#239. Sliding Window Maximum

LeetCode#239. Sliding Window Maximum

  • 題目:給定一個int陣列nums和一個滑動視窗值k,返回每個滑動子視窗的最大元素組成的陣列(滑動子視窗是nums的連續子串,包括k個元素)
  • 難度:Hard(如果對時間複雜度沒有要求,難度並不大)
  • 思路:暴力解法-兩層for迴圈分別求出每一個子視窗的最大元素
  • 程式碼:
class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {

        if(nums == null || nums.length == 0 || k <= 0|| nums.length < k){
            return
nums; } int len = nums.length-k+1; int[] result = new int[len]; for(int i = 0; i< nums.length-k+1; i++){ int max = nums[i]; for(int j = 0; j < k; j++){ if(nums[i+j] > max){ max = nums[i+j]; } } result[i] = max
; } return result; } }

方法二:利用雙向佇列維護子視窗中最大元素

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if (nums == null || k <= 0) {
            return new int[0];
        }
        int len = nums.length;
        int[] result = new int[len-k+1];
        int
index = 0; LinkedList<Integer> queue = new LinkedList<Integer>(); for(int i = 0; i < len; i++){ //如果第i個元素大於佇列最後一個下標在陣列中的值,就把佇列最後一個pop掉 while(!queue.isEmpty() && nums[queue.peekLast()] < nums[i]){ queue.pollLast(); } //已經過期的隊頭元素,pop掉 while(!queue.isEmpty() && queue.peek() < i-k+1){ queue.poll(); } queue.offer(i); if(i >= k-1){ result[index++] = nums[queue.peek()]; } } return result; } }