力扣 480 滑動視窗中位數 劃分樹 Treap

2021-10-18 22:56:29 字數 2866 閱讀 2013

思路一:需要一種可以快速求出區間第k

kk大的資料結構,那麼主席樹、tre

aptreap

trea

p等都滿足題意,這裡我用了劃分樹,他也可以求出區間第k

kk大,不過不支援動態修改,詳見我這篇部落格。

class

dividetree

void

build

(int depth,

int l,

int r)

else

tree[depth+1]

[ridx++

]=mid_value;

}else

if(tree[depth]

[i]else

tree[depth+1]

[ridx++

]=tree[depth]

[i];

}build

(depth+

1,l,mid)

;build

(depth+

1,mid+

1,r);}

intquery

(int l,

int r,

int k)

int_query

(int depth,

int l,

int r,

int ql,

int qr,

int k)

private

: vector

int>> tree;

vector

int>> num;

vector<

int> vec;};

class

solution

return ans;}}

;

思路二:直接上tre

aptreap

trea

p,不會的可以看我這篇部落格。

class

treap

void

insert

(int

&idx,

int v)

siz[idx]++;

if(val[idx]

==v)

++eql[idx]

;else

if(val[idx]

else

}void

del(

int&idx,

int v)if(

!lson[idx]

||!rson[idx]

) idx=lson[idx]

+rson[idx]

;else

if(rnd[lson[idx]

]else

}else

if(val[idx]

else

}int

querynum

(int idx,

int rk)

private

:int ans,sz;

vector<

int> lson,rson,val,rnd,siz,eql;

void

modifysize

(int idx)

void

leftrotate

(int

&idx)

void

rightrotate

(int

&idx)};

class

solution

}return ans;}}

;

思路三:兩個堆+延遲刪除。感覺這個還是比較麻煩的,不過思想值得學習……簡而言之就是用兩個堆來維護序列,用乙個大根堆維護較小的k2+

1+12k​+

1個元素,然後用乙個小根堆維護較大的k

2k \over 2

2k​個元素,這樣就很容易得到序列的中位數了。最重要的是延遲刪除怎麼實現?我們可以用乙個雜湊表,h[i

]=vh[i]=v

h[i]=v

表示i

ii這個數需要刪除v

vv次,然後寫乙個che

ckcheck

chec

k函式判斷當前堆頂的元素是否需要刪除……那麼在什麼時候需要呼叫che

ckcheck

chec

k函式呢?因為我們經常需要進行top

()top()

top(

)操作,所以一定要保證在進行這些操作前堆頂元素不是需要被刪除的,所以當我們在邏輯上修改某個堆的元素個數時,要呼叫這個函式;在彈出堆頂元素後,也要呼叫這個函式(就是這兩點讓我wa了半天 艹)。具體看**吧,或者看官方題解,細節太多不想贅述了。

class

dualheap

template

<

typename t>

void

checkheaptop

(t &heap)}}

void

balance()

else

if(max_siz

}void

push

(int val)

void

erase

(int val)

double

getmedian()

};class

solution

return ans;}}

;

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 位。你的任...

2 3 力扣 滑動視窗中位數

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