經典演算法面試題

2022-06-22 01:21:08 字數 1606 閱讀 6213

維護乙個1000個節點的小頂堆。

時間複雜度o(nlogk)

具體步驟:(1)將k個陣列的第乙個元素取出來,維護乙個小頂堆。

(2)彈出堆頂元素存入結果陣列中,並把該元素所在陣列的下乙個元素取出來壓入隊中。

(3)調整堆的結構,使其滿足小頂堆的定義。

(4)重複(2)(3)直到合併完成。

動態規劃:dp[n][m]表示n被分解為最大為m的數的方案數

\[dp\left[ n \right]\left[ m \right] = \sum\limits_^ \right]\left[ k \right]} \]

借助快排partition的思想,平均時間複雜度是o(n)

等價於求陣列中第n/2大的數,和4中思想一樣,平均時間複雜度o(n)

在乙個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。

思路分析:我們注意到這個二維陣列的行和列都是公升序的,也就是說最上面的一行和最右邊的一列在整體上也是公升序的,在乙個排序陣列上查詢某個我們會很自然的想起二分法。這樣我們每次都把要查詢的數和當前剩下的二維陣列的右上角數字比較,這樣每次我們都可以排除掉一行或一列。演算法的時間複雜度是o(n+m),也就是行數加列數。

題一:替換空格(劍指offer)

題二:兩個排序陣列a1和a2,現在想把a2插入a1中並仍保持有序。

思路分析:陣列是個順序表,我們往陣列中插入某個數的話必須要移動當前位置後面所有的數。常規的思路是每次插入乙個數並移動後面的數,這樣多次插入後會導致陣列中有的數被移動了多次,極大浪費了效率。我們希望每個數移動一次就到達它最終的位置,所以我們往往會反向移動陣列,這樣做的好處是移動當前數時後面的數已經到達了最終位置,我們移動當前數不會影響到後面的數,這樣就確保了每個數隻被移動一次。

歸併排序的思想,用快慢指標不斷二分鍊錶。

斐波那契數列:f(0) = 0, f(1) = 1, f(n) = f(n - 1) + f(n - 2)

方法一:遞迴,效率低

方法二:迴圈,正著推

方法三:矩陣運算

解題思路:26進製轉10進製。

解法1:右移原數判斷,如果輸入是負數可能陷入死迴圈。

解法2:左移1

解法3:把乙個整數-1後與原數做與運算會消去原數最左邊的1

把乙個陣列劃分成兩部分,使其方差和最小。

d(x) = e(x^2) - [e(x)]^2

迭代求和。

計算(1+((2+3)*(4*5))),leetcode224

解題思路:最大連續子串行的變種題,從前往後遍歷一遍求最大連續子串行和,然後從後往前遍歷一遍求最大連續子串行和。

思路拓展:對於刪去中間一段不好直接操作的話,可以先從前往後遍歷,在從後往前遍歷。

解法: 先討論能不能做完:每個鍋在t分鐘內能做的餅數為min(mi,vi*t), 降序排列,前k個鍋能做出來的餅》l就能; 如果不能做完:直接輸出前k個鍋能做餅的和;如果能:二分最短時間,然後判斷在mid分鐘內能不能做完餅,判斷方法同t分鐘的情況。

思路:查詢時先想一下二分。

解題思路:把該節點下個節點的值複製到該節點,刪除下個節點(注意該節點是尾節點和鍊錶只有乙個節點的特殊情況)

經典演算法面試題

1 說是有乙個文字檔案,大約有一萬行,每行乙個詞,要求統計出其中最頻繁出現的前十個詞。先用雜湊,統計每個詞出現的次數,然後用在n個數中找出前k大個數的方法找出出現次數最多的前10個詞。2 如題1,但是這次檔案特別大,沒有辦法一次讀入記憶體。1 直接排序,寫檔案時,同時寫入字串及其出現次數。2 可以用...

C 經典演算法面試題

static intsum int x static void sort int nums console.writeline nums i 字典的定義 必須包含名空間system.collection.generic dictionary裡面的每乙個元素都是乙個鍵值對 由二個元素組成 鍵和值 鍵必...

經典面試題

1.以下三條輸出語句分別輸出什麼?char str1 abc char str2 abc const char str3 abc const char str4 abc const char str5 abc const char str6 abc cout boolalpha str1 str2 ...