1. 程式人生 > 其它 >leetcode—480. 滑動視窗中位數

leetcode—480. 滑動視窗中位數

技術標籤:leecode

480. 滑動視窗中位數

中位數是有序序列最中間的那個數。如果序列的大小是偶數,則沒有最中間的數;此時中位數是最中間的兩個數的平均數。

例如:

  • [2,3,4],中位數是3
  • [2,3],中位數是(2 + 3) / 2 = 2.5

給你一個數組nums,有一個大小為k的視窗從最左端滑動到最右端。視窗中有k個數,每次視窗向右移動1位。你的任務是找出每次視窗移動後得到的新視窗中元素的中位數,並輸出由它們組成的陣列。

示例:

給出nums=[1,3,-1,-3,5,3,6,7],以及k= 3。

視窗位置                      中位數
---------------               -----
[1  3  -1] -3  5  3  6  7       1
 1 [3  -1  -3] 5  3  6  7      -1
 1  3 [-1  -3  5] 3  6  7      -1
 1  3  -1 [-3  5  3] 6  7       3
 1  3  -1  -3 [5  3  6] 7       5
 1  3  -1  -3  5 [3  6  7]      6

因此,返回該滑動視窗的中位數陣列[1,-1,-1,3,5,6]

暴力法,雙迴圈,主要難點在於維護一個長度為k的視窗。

class Solution {
    public double[] medianSlidingWindow(int[] nums, int k) {
        int n = nums.length;
        double[] media = new double[n-k+1];
        int i=0;
        for(int l=0,r=k;r<=n;r++){
            long[] window = new long[k];//int[] window = new int[k];使用int會報錯,輸入:[2147483647,2147483647] 2 輸出:[-1.00000] 預期:[2147483647.00000]
            for(int j=l; j<r;j++){  //核心在這個for迴圈,維護window
                window[j-l] = nums[j];
            }
            Arrays.sort(window);
            if(k%2 != 0)
            media[i++] = window[k/2];
            else
            media[i++] = (double)(window[k/2] + window[(k-1)/2])/2;//注意資料型別轉換
            l++;
        }

        return media;

    }
}