/*
尋找最大的k個數:
解法1:
如何避免對後n-k個數的排序,選擇排序和交換排序都是不錯的選擇,o(n*k),如果k<=log2n時,那麼可以選擇部分排序。
解法三:
尋找n個數中最大的k個數,本質就是尋找最大的k個數中最小的那個,也就是第k大的數。可以使用二分搜尋,對於乙個給定的數p,可以在o(n)的時間複雜度內找到所有
不小於p的數。加入n個數中最大的數為vmax,最小的數字vmin,那麼這n個數中的第k大數一定在區間[vmax,vmin]之間。可以在這個區間內二分搜尋n個數中的第k個大數p
解法四:
用set來做,實現留乙個k個元素大小的set,
如果資料不能全部裝入記憶體,盡可能少地遍歷所有資料。不妨設n > k,前k個數中的最大k個數是乙個退化的情況。所有k個數就是最大的k個數。
可以用容量為k的最小堆來儲存最大的k個數,最小堆的堆頂元素師最大k個數中最小的乙個。若破壞了最小堆的結構,阿麼需要o(log2k)來維持堆的性質。
解法5:
用雜湊陣列來做,假設所有整數在(0,maxn)區間中,利用乙個陣列count[maxn]來記錄每個整數出現的次數,只需要掃面一遍就可以得到count陣列,然後尋找第k大
元素。擴充套件:如果最大的數為vmax,最小的數為vmin,那麼可以把區間[vmin,vmax]分成m塊,每個小區間的跨度為d = (vmax - vmin)/m,即[vmin,vmin+d],
[vmin+d,vmin+2d],...,然後掃瞄一遍所有元素,統計各個小區間中的元素個數,可以知道第k大的元素在哪乙個區間,再對那個小區間進行分塊處理,
不能保證線性,盡量找乙個大的m,但m取值受記憶體限制。
*/
程式設計之美 第二章 數字之魅 2 3尋找發帖水王
尋找發帖水王 本質 尋找出現超過一半次數的人 如果已經排序,那麼中序數就是那個人,即下標是,這個列表的第n 2項是 從0開始編號 如果每次刪除兩個不同的id,可以降低時間複雜度 輸入 7 1 2 3 2 4 2 2 81 2 3 2 4 2 2 5 輸出 2 沒有 include const int...
程式設計之美 第二章 數字之魅 2 4 1的數目
1的數目 給定乙個十進位制正整數n,寫下從1開始,到n的所有整數然後數一下其中出現的所有1的個數 例如 n 2,寫下1,2這樣只出現了1個1 n 12,寫下1,2,3,4,5,6,7,8,9,10,11,12,這樣1的個數是5 問題是 1寫乙個函式f n 返回1到n之間出現的1的個數,比如f 12 ...
第二章 程式設計之道
程式設計師的修煉從優秀帶卓越 第二章 程式設計之道 切記一根筋 優秀的開發者和平庸的開發者之間存在著的一條鴻溝,因為優秀的程式設計師所具有的的素質似乎是與生俱來。那麼成為優秀的程式設計師的方法是拋開程式設計,放下編譯器,好好的評估一下自己正在做的事情。你必須培養自己對於程式設計周邊所有事情的熱情。你...