leetcode刷題規律

2021-10-24 11:35:27 字數 2441 閱讀 7541

題目特徵: 要求乙個組合的vector> 合集。此時需要用回溯法求出所有的可能的集合。

題目列表

39.組合陣列

**號碼的字母組合

組合總和 ii

組合組合總和 iii

因子的組合

組合總和 ⅳ

技巧

(1)有些題目需要先對陣列進行乙個排序,然後再元素的選擇過程中,要注意是否可以重複選擇。

(2)如果對結果的集合要求每種結果裡的元素不能重複,則需要設定乙個begin位置,代表元素其實搜尋的位置,每次從begin開始搜尋;對於不可以重複選擇的,在遞迴的時候要把起始位置設定為i+1;如果允許重複使用,則起始位置為i

(3)如果結果的集合裡,相同元素的不同順序視為不同,則可以不設定begin

(4)有些陣列裡有重複元素,有些沒有重複元素。對有重複元素的需要根據題意做一些處理。

對dp問題和回溯法的區別之一就是是否需要列出所有的排列組合。如果不需要排列組合只要得到是否能達到target/達到target的有幾種等問題,則需要用dp求解。一般dfs會超時。

揹包問題題解

受此啟發整理一下揹包問題的思路。

揹包問題特徵:需要從陣列nums裡,選擇幾個元素,得到target。可以重複選是完全揹包,不可以是0-1揹包

(1)377.組合總和:正整數、不重複陣列,求和為目標的組合數。

完全揹包需要考慮元素之間的順序,順序不同視為不同組合外迴圈容量,內迴圈遍歷元素

dp[i]代表容量為i有幾種組合

dp[i]=dp[i-nums0]+dp[i-nums1]+…

理解:所有組合,最後乙個元素都是由陣列中元素組成,所以把它摘出來,則所有的方案就是他們被減去後的方案數相加。

(2)494目標和:非負整數陣列,目標和s,要求所有數用上,前面加+或者-,得到目標和的方案數。

正數集合x,負數集合y,則x+y=sum,x-y=s,則x=(sum+s)/2,且(sum+s)不能是奇數,奇數則代表不能有組合

轉化為0-1揹包,從陣列中選幾個數能湊成x、外迴圈陣列、內迴圈容量,且使用滾動陣列時,內迴圈需要從後向前更新,否則會覆蓋上一層的資料。

第i個元素,選擇拿或者不拿:

dp[i][j]代表前i個元素,得到和為j的方案數,則dp[i][j]=dp[i-1][j]+dp[i-1][j-numi].

(3)有零錢和目標,求拿到目標有幾種方案

完全揹包、外迴圈陣列、內迴圈目標和,內迴圈從後向前

dp[i][j]代表前i個幣,容量為j有幾種方案,則dp[i][j]=dp[i-1][j]+dp[i-1][j-coin]+dp[i-1][j-2*coin]+…(不用、用乙個、兩個…

(4)單詞拆分:字串拆分,能否拆成字典裡單詞的個數

完全揹包、從陣列中拿元素,可以重複拿,能否將揹包填滿。外迴圈是容量,內迴圈是子字串

dp[i]代表容量為i揹包是否能被填滿。dp[i]=dp[i-numsi],如果某個單詞可以將前i個字母組成的字串拆分,那麼它能否被填滿只與dp[i-numsi]有關了。並且一旦dp[i]=1,則可以停止搜尋

(5)分割等和子集:正整數陣列,分割為兩個和相等的子集則轉換為0-1揹包,能否拿一半和的容量

dp[i][j]代表前i個元素拿j容量是否可以,那麼dp[i][j]=dp[i-1][j]||dp[i-1][j-numi] 意思是拿或者不拿第i個元素,只要有乙個為真則為真

0-1揹包,外迴圈陣列,內迴圈容量

(6)474. 一和零:m個0和n個1,能組成陣列中元素的最大個數

因為m個0和n個1只能用一次,因此是0-1揹包,兩個揹包揹包容量分別為m和n,因此要建乙個二維陣列儲存他們,dp[m][n]代表m個0和n個1能組成的最大個數

0-1揹包、外迴圈遍歷陣列,內迴圈遍歷容量

內迴圈需要雙重迴圈,分別是迴圈0和1的數量,dp[m][n]=max(dp[m][n],dp[m-count0][n-count1]+1)

(7)322. 零錢兌換

不同金額的陣列和乙個目標值,判斷最少需要的金幣數。

完全揹包,外迴圈容量,內迴圈陣列

dp[i]代表容量為i時,最少需要的筆數量,dp[i]=min(dp[i],dp[i-x]+1),x為幣的面值

attention:

1.一般dp陣列會比容量的大小多1,因此在根據i遍歷dp求dp[i]的時候,如果需要訪問原陣列nums,則對應的下標應該為nums[i-1]

2.內外迴圈需要注意 當遍歷陣列的時候一般無順序要求,遍歷容量時有要求

開始刷題LeetCode

今天決定開始刷題,每天至少一題,如果題目確實沒有解決出來沒有關係,但是要保證每天至少接觸了一道新的題目!一定要堅持下去,現在是個菜鳥可能會感覺有點難度,堅持下去,總有一天會好的!今天是第一天,做的第乙個題目 reverse words in a string given an input strin...

leetcode刷題歷程

難度 簡單 題目 給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 ...

LeetCode刷題總結

123 4567 891011 12 元素交換 swap a 1 a 3 sort排序 sort a.begin a.end 陣列顛倒 reverse a.begin a.end 陣列元素置為0 memset a,0,a.size 陣列取值 a.push back 定義二維陣列 vector vec...