題目特徵: 要求乙個組合的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...