思路一:需要一種可以快速求出區間第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 位。你的任務是找出每次視窗移動後得到的新視窗中元素...