題目:如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert()方法讀取資料流,使用getmedian()方法獲取當前讀取資料的中位數。
思路:
暴力法用vector儲存資料流,獲取中位數【partition】,獲取中位數這個邏輯也複雜
使用堆,乙個最小堆,乙個最大堆 【最大堆裡面最大的數字,小於最小堆裡面最小的樹】
保持這兩個堆的size一致,先插入最大堆,再插入最小堆,再插入最大堆,再插入最小堆
如果是奇數,最大堆的堆頂就是中位數;如果是偶數,最大堆的堆頂和最小堆的堆頂的平均值是中位數
問題來了:怎麼插入呢?記錄一下是奇數次插入-最大堆,還是偶數次插入-最小堆;
如果插入到最大堆x,最大堆的堆頂p,最小堆堆頂q:
如果x <= q; 那直接插入最大堆
如果x > q,那麼彈出最小堆的堆頂q,並將q加入到最大堆,把x加入最小堆
如果插入到最小堆x,最大堆的堆頂p,最小堆堆頂q:
如果x >= p ,插入最小堆
如果x < p, 那麼彈出最大堆的堆頂p,並將p加入到最小堆,把x加入到最大堆
啟發或者坑:
獲取堆頂元素,要先考慮堆裡面有沒有元素
**:
class solution
int maxtop;
int mintop;
int temp;
if (times%2==1) else
} else else }}
double getmedian()
}};
劍指Offer 49 醜數
我們把只包含因子2 3和5的數稱為醜數。求按從小到大的順序的第1500個醜數。例 6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當作第乙個醜數。遍歷數字,對每個數字判斷是否只包含2 3 5因子。問題在於,有很多無用的計算,增加時間複雜度。時間複雜度 o n 空間複雜度 o 1 可以發現...
劍指offer49 醜數
把只包含質因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。思路 1.每次找出乙個最小丑數res i 都會產生三個新的醜數,2 res i 3 res i 5 res i 2.如果我...
劍指 Offer 49 醜數
我們把只包含質因子 2 3 和 5 的數稱作醜數 ugly number 求按從小到大的順序的第 n 個醜數。出看這道題可能感覺能算,但是思路就非常繁瑣。解法一 這個只說說思路,既然2,3,5是該數的因子,那麼該數除以2,3,5的餘數一定是 0 那麼就讓每個數連續除以2,3,5,只到餘數不為0 結果...