最小棧 leetcode 295.
題目大意:給定一個資料流,實現一個以查詢中位數為方法的類,該類需要有初始化構造方法、新增資料值和查詢中位數的方法
解題思路:主要難點是想用什麼方法,這題肯定不能來一個數字就給資料排序,得用到資料結構,也就是小頂堆和大頂堆,小頂堆儲存最大值部分,大頂堆儲存最小值部分,預設以小頂堆多一個(如果出現資料流長度為奇數堆的情況下),這裡有一個滑動入值的概念,當兩個堆大小不一致時,肯定是小頂堆多於大頂堆了,這時候我得先將該新數字放進小頂堆中過濾(排序)一遍後再將新的小頂堆的堆頂取出來放到大頂堆中去,這樣就不會破壞小頂堆的值是大於大頂堆的值的原則,且是排序了的。當兩個堆大小一致時,同理。查詢中位數的話就是判斷是否大小一致,如果兩個堆大小一致就說明是偶數,那就將兩個堆堆頂拿到/2就可以了,不一致的話我們設定了小頂堆的大小是>=大頂堆的,所以直接拿出小頂堆的堆頂即可。
class MedianFinder {
Queue<Integer> A,B;
public MedianFinder() {
A = new PriorityQueue<>();
B = new PriorityQueue<>((a, b) -> (b - a));
}
public void addNum(int num) {
if(A.size() != B.size()) {
A.add(num);
B.add(A.poll());
} else{
B.add(num);
A.add(B.poll());
}
}
public double findMedian() {
return A.size() == B.size() ? (A.peek() + B.peek()) / 2.0 : A.peek() * 1.0;
}
}
/**
* Your MedianFinder object will be instantiated and called as such:
* MedianFinder obj = new MedianFinder();
* obj.addNum(num);
* double param_2 = obj.findMedian();
*/
總結:對於困難型別的題目一開始還是不能被嚇到,要敢於思考想想所學的資料結構有哪些能幫到解決該題目,主要還是這些資料結構運用的不夠熟練,思路其實很清晰了