維護一個1000個節點的小頂堆。算法
時間複雜度O(nlogk)數組
具體步驟:(1)將k個數組的第一個元素取出來,維護一個小頂堆。app
(2)彈出堆頂元素存入結果數組中,並把該元素所在數組的下一個元素取出來壓入隊中。函數
(3)調整堆的結構,使其知足小頂堆的定義。編碼
(4)重複(2)(3)直到合併完成。指針
動態規劃:dp[n][m]表示n被分解爲最大爲m的數的方案數code
\[dp\left[ n \right]\left[ m \right] = \sum\limits_{k = 1}^{m - 1} {dp\left[ {n - m} \right]\left[ k \right]} \]排序
藉助快排partition的思想,平均時間複雜度是O(n)遞歸
等價於求數組中第n/2大的數,和4中思想同樣,平均時間複雜度O(n)leetcode
在一個二維數組中(每一個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
思路分析:咱們注意到這個二維數組的行和列都是升序的,也就是說最上面的一行和最右邊的一列在總體上也是升序的,在一個排序數組上查找某個咱們會很天然的想起二分法。這樣咱們每次都把要查找的數和當前剩下的二維數組的右上角數字比較,這樣每次咱們均可以排除掉一行或一列。算法的時間複雜度是O(n+m),也就是行數加列數。
題一:替換空格(劍指offer)
請實現一個函數,將一個字符串中的每一個空格替換成「%20」。例如,當字符串爲We Are Happy.則通過替換以後的字符串爲We%20Are%20Happy。
題二:兩個排序數組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分鐘的狀況。
思路:查詢時先想一下二分。
解題思路:把該節點下個節點的值複製到該節點,刪除下個節點(注意該節點是尾節點和鏈表只有一個節點的特殊狀況)