leetcode—480. 滑動視窗中位數
阿新 • • 發佈:2021-02-04
技術標籤:leecode
中位數是有序序列最中間的那個數。如果序列的大小是偶數,則沒有最中間的數;此時中位數是最中間的兩個數的平均數。
例如:
[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; } }