滑動視窗的中位數

2021-10-19 07:51:56 字數 1513 閱讀 4039

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

例如:[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 始終有效,即:k 始終小於等於輸入的非空陣列的元素個數。

與真實值誤差在 10 ^ -5 以內的答案將被視作正確答案

【解析】

需要設計乙個「資料結構」,用來維護滑動視窗,並且需要提供如下的三個介面:

insert(num):將乙個數num 加入資料結構;

erase(num):將乙個數 num 移出資料結構;

getmedian():返回當前資料結構中所有數的中位數

class dualheap 

private:

// 不斷地彈出 heap 的堆頂元素,並且更新雜湊表

templatevoid prune(t& heap)

heap.pop();

}else }}

// 調整 small 和 large 中的元素個數,使得二者的元素個數滿足要求

void makebalance()

else if (smallsize < largesize)

}public:

void insert(int num)

else

makebalance();

}void erase(int num)

}else

}makebalance();

}double getmedian()

};class solution

vectorans = ;

for (int i = k; i < nums.size(); ++i)

return ans;

}};

滑動視窗中位數

中位數是有序序列最中間的那個數。如果序列的長度是偶數,則沒有最中間的數 此時中位數是最中間的兩個數的平均數。例如 給你乙個陣列 nums,有乙個長度為 k 的視窗從最左端滑動到最右端。視窗中有 k 個數,每次視窗向右移動 1 位。你的任務是找出每次視窗移動後得到的新視窗中元素的中位數,並輸出由它們組...

480 滑動視窗中位數

題目描述 中位數是有序序列最中間的那個數。如果序列的大小是偶數,則沒有最中間的數 此時中位數是最中間的兩個數的平均數。例如 2,3,4 中位數是 3 2,3 中位數是 2 3 2 2.5 給你乙個陣列 nums,有乙個大小為 k 的視窗從最左端滑動到最右端。視窗中有 k 個數,每次視窗向右移動 1 ...

480 滑動視窗中位數

中位數是有序序列最中間的那個數。如果序列的長度是偶數,則沒有最中間的數 此時中位數是最中間的兩個數的平均數。例如 2,3,4 中位數是 3 2,3 中位數是 2 3 2 2.5 給你乙個陣列 nums,有乙個長度為 k 的視窗從最左端滑動到最右端。視窗中有 k 個數,每次視窗向右移動 1 位。你的任...