careercup 高等難度 18 6

2021-09-22 19:12:29 字數 366 閱讀 5304

18.6 設計乙個演算法,給定10億個數字,找出最小的100萬個數字。假定計算機記憶體足以容納全部10億個數字。

解法:方法1:排序

按公升序排序所有的元素,然後取出前100萬個數,時間複雜度為o(nlog(n))

方法2:大頂堆

我們可以使用大頂堆來解題。首先,為前100萬個數字建立乙個大頂堆

然後,遍歷整個數列,將每個元素插入大頂堆,並刪除最大的元素。

遍歷結束後,我們將得到乙個堆,剛好包含最小的100萬個數字。這個演算法的時間複雜度為o(nlog(m)),其中m為待查詢數值的數量。

方法3:選擇排序演算法(假如你可以改變原始陣列)

如果這些元素各不相同,則可以在預期的o(n)時間內找到第i個最小的元素。

careercup 高等難度 18 2

18.2 編寫乙個方法,洗一副牌。要求做到完美洗牌,換言之,這幅牌52!種排列組合出現的概率相同。假設給定乙個完美的隨機發生器。解法 假定有個陣列,含有n個元素,類似如下 1 2 3 4 5 利用簡單構造法,我們不妨先問自己,假定有個方法shuffle 對n 1個元素有效,我們可以用它來打亂n個元素...

careercup 高等難度 18 5

18.5 有個內含單詞的超大文字檔案,給定任意兩個單詞,找出在這個檔案中這兩個單詞的最短距離 也即相隔幾個單詞 有辦法在o 1 時間裡完成搜尋操作嗎?解法的空間複雜度如何?解法1 我們假設單詞word1和word2誰在前誰在後無關緊要。要解決此題,我們需要遍歷一次這個檔案。在遍歷期間,我們會記下最後...

careercup 中等難度 17 7

17.7 給定乙個整數,列印該整數的英文描述 例如 one thousand,two hundred thirty four 解法 舉個例子,在轉換19 323 984時,我們可以考慮分段處理,沒三位轉換一次,並在適當的地方插入 thousand 千 和 million 百萬 也即,convert ...