LeetCode 滑動視窗中位數(二分法)

2021-09-16 14:08:06 字數 1913 閱讀 8473

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

例如:

[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]。

採取二分法進行插入排序,維持當前視窗元素遞增。並且使用二分法刪除需要移除的元素。 (時間複雜度o(n log2n))

class

solution

vector<

double

>

result;

vector<

int>

tempsortvec;

int numssize = nums.

size()

, index =0;

//第一步:下面將初始化第乙個視窗,直到當前視窗大小達到k

while

(tempsortvec.

size()

< k)

//此時已經達到了k,選擇中位數

if(k %2==

0)else

//第二步:往後移動視窗,始終維持當前視窗為[index - k, index](共k個元素)

for(

; index < numssize;

++index)

else

}return result;

}//二分法插入元素,刪除元素,needdelflag是否需要刪除元素,needdelnum需要刪除的元素值,needinsertnum需要插入的元素值

void

myhelper

(vector<

int>

&tempsortvec, bool needdelflag,

int needdelnum,

int needinsertnum)

else

if(tempsortvec[mid]

> needdelnum)

else}}

//將needinsertnum插入到陣列中

if(tempsortvec.

size()

==0)else

else

if(tempsortvec[mid]

< needinsertnum)

else

}//進行插入

**雖說有些長,但是思路非常清晰。

LeetCode 滑動視窗中位數

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

滑動視窗中位數

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

leetcode480 滑動視窗中位數

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