在做了演算法題長時間不複習後總是會遺忘,從今天開始寫部落格,力爭用最簡單的話語講明演算法,以便鞏固與複習。
題目:給你乙個整數陣列 nums ,找到其中最長嚴格遞增子串行的長度。 子串行是由陣列派生而來的序列,刪除(或不刪除)陣列中的元素而不改變其餘元素的順序。例如,[3,6,2,7] 是陣列 [0,3,1,6,2,2,7] 的子串行。
解答:新建陣列dp,dp[i]表示陣列中前i個數中,以第i個元素結尾的最長遞增子串行的長度。對於元素i需要遍歷前i-1個數,並且在遍歷第i個數的時候,陣列dp中對應的前i-1個數的最長子序列均已計算完畢。因此對於第i個元素只需要統計前i-1個數中比第i個數小的最長子序列的長度。
以陣列[0,3,1,6,2,2,7]為例:
具體的**實現如下所示:
class
solution
sum =
max(sum, arr[i]);
}return sum;}}
;
需要注意的是並不是dp中最後乙個資料最大,需要進行比較。
該演算法之所以稱為貪心,是因為想要讓序列上公升的盡可能慢,也就是子串行的資料盡可能小。建立乙個陣列dp,這時的dp表示的含義與第一種方法不同,dp[i]表示長度為 i 的最長上公升子串行的末尾元素的最小值,最後的結果是陣列的長度。在遍歷的同時將符合條件的資料插入陣列或者將陣列中的資料進行替換。
演算法主要功能是將比dp中最後乙個數大的資料直接插到陣列末尾,將比最後乙個數小的數進行替換。這一步其實比較難理解,我們舉個例子,[4, 10, 11, 12, 13, 14, 5, 8, 9]。我們可以比較直觀的看出最長子序列長度為6。
從這兩個例子中我們可以看出,該演算法的本質是將我們當前獲取的最長子序列的較大的數由後面的較小的數替換。該型別的題目中最關鍵的問題是無法確定是否將乙個數插入該子串行。該方法就是為了避免這種情況的出現,或者說我們可以將任意符合條件的資料插入子串行,最後演算法會對結果進行處理。
具體的**實現如下所示:
class
solution
else
} v1[begin]
= nums[i];}
}return v1.
size()
;}};
給你乙個二維整數陣列 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 個信封的寬度和高度。
當另乙個信封的寬度和高度都比這個信封大的時候,這個信封就可以放進另乙個信封裡,如同俄羅斯套娃一樣。
請計算 最多能有多少個 信封能組成一組「俄羅斯套娃」信封(即可以把乙個信封放到另乙個信封裡面)。
注意:不允許旋轉信封。
class
solution
intmaxenvelopes
(vectorint>>
& envelopes)
} maxn =
max(maxn, arr[i]);
}return maxn;}}
;
該方法與動態規劃類似,只不過重點是如何將所有的信封按照尺寸合理的排序。在實現中是將信封首先按照長進行排列,長度相同按照寬排列。
容易出錯的例子:[[2, 100], [3, 200], [4, 300], [5, 220]. [6, 230], [7, 240]]。
LeetCode 300 最長遞增子串行
300.最長遞增子串行 我們記狀態 dp i dp i dp i 表示以第 i ii 個元素結尾的最長上公升子串行的長度,那麼專一方程就可以定義為 dp i m ax d p j 1 0 j ndnu ms j ms i dp i max dp j 1 0 leq jdp i max dp j 1 ...
LeetCode300 最長遞增子串行
題目鏈結 題目描述 給你乙個整數陣列 nums 找到其中最長嚴格遞增子串行的長度。子串行是由陣列派生而來的序列,刪除 或不刪除 陣列中的元素而不改變其餘元素的順序。例如,3,6,2,7 是陣列 0,3,1,6,2,2,7 的子串行。示例 輸入 nums 10,9,2,5,3,7,101,18 輸出 ...
leetcode 300 最長遞增子串行
思路,動態規劃 狀態含義 dp i 第i個元素所表示的最大的遞增序列長度 轉移方程 第i個是否可以放在第j個後面 1.可以放,dp i max dp i dp j 1 2.不可以放,跳過 遍歷dp找最大 class solution max max max,dp i return max inclu...