08 16 組合問題

2021-09-26 06:06:06 字數 3880 閱讀 6163

題目

給定兩個整數 n 和 k,返回 1 … n 中所有可能的 k 個數的組合。

示例:輸入: n = 4, k = 2

輸出:[

[2,4],

[3,4],

[2,3],

[1,2],

[1,3],

[1,4],

]

思路遞迴+回溯

遞迴+回溯可以看看全排列問題,掌握了就都懂了

第一次遞迴,temp分別放1,2,3…n;即:

temp[0]=1;

temp[0]=2;

temp[0]=3;

temp[0]=n;

第二次遞迴

temp= ;

temp= ;

temp= ;

temp= ;

temp= ;

temp= ;

temp= ;

temp= ;

temp= ; //這個不滿足

for(int i=pos;i題目

給定乙個無重複元素的陣列 candidates 和乙個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。

candidates 中的數字可以無限制重複被選取。

說明:所有數字(包括 target)都是正整數。

解集不能包含重複的組合。

示例 1:

輸入: candidates = [2,3,6,7], target = 7,

所求解集為:

[[7],

[2,2,3]

]示例 2:

輸入: candidates = [2,3,5], target = 8,

所求解集為:

[[2,2,2,2],

[2,3,3],

[3,5]

]

思路本題無重複無元素

用遞迴+回溯,我用的減法

首先拍了個序,所以剪枝的多些,而且當有重複元素的時候,一定要排序的。

起始位置一直都是自己,因為自己可以用無數次,碰到負數,後面的數就可以結束了,因為後面的數更大一些。

下圖中國紅色,代表遞迴結束,當然減到0也結束了。

多了乙個排序,可以剪枝更多

class solution

void dfs(vector& candidates,int pos,int sum)

for(int i=pos;i沒有排序的

class solution

void dfs(vector& candidates,int pos,int sum)

for(int i=pos;i題目

找出所有相加之和為 n 的 k 個數的組合。組合中只允許含有 1 - 9 的正整數,並且每種組合中不存在重複的數字。

說明:所有數字都是正整數。

解集不能包含重複的組合。

示例 1:

輸入: k = 3, n = 7

輸出: [[1,2,4]]

示例 2:

輸入: k = 3, n = 9

輸出: [[1,2,6], [1,3,5], [2,3,4]]

思路和上題一模的

首先,必須排序,就像全排列(有重複元素)一樣的

只是每次的起步就不是自己了,而是下一元素 : i+i

dfs(candidates,i+1,sum); //下乙個元素

而去重的思想就是每層減去的數,不能有重複的,比如目標值 8,元素 [1,1,2,5,6,7,10],遞迴第一層:

sum=8-1

sum=8-1

sum=8-2

sum=8-5

sum=8-6

sum=8-7

sum=8-10當然這個剪枝掉了,不會遞迴了

由上可知,8-1重複了兩次,因為1在陣列中重複了兩次,第一層的重複會導致第二層8-1-7也有兩次發生,同理最後8-1-7會儲存兩次,所以我們再第一次就要判斷這層的上乙個分支減去的元素是不是和本次將去的元素相同,即:

if(i>pos && candidates[i-1]==candidates[i] ) //每層相同的數隻減一次

和去全排列中相同元素要順序不變排的道理一樣。

class solution

void dfs(vector& candidates,int pos,int sum)

for(int i=pos;ipos && candidates[i-1]==candidates[i] ) //每層相同的數隻減一次

continue;

if(sum-candidates[i]<0) //剪枝

break;

temp.push_back(candidates[i]); //回溯

//sum-=candidates[i];

dfs(candidates,i+1,sum-candidates[i]); //下乙個元素

temp.pop_back(); //回溯

//sum+=candidates[i];}}

};題目

找出所有相加之和為 n 的 k 個數的組合。組合中只允許含有 1 - 9 的正整數,並且每種組合中不存在重複的數字。

說明:所有數字都是正整數。

解集不能包含重複的組合。

示例 1:

輸入: k = 3, n = 7

輸出: [[1,2,4]]

示例 2:

輸入: k = 3, n = 9

輸出: [[1,2,6], [1,3,5], [2,3,4]]

這題既對個數要求,又對和有要求,那麼遞迴+回溯,較之前兩題簡單些,和leetcode77 組合有點像

class solution 

void dfs(int pos,int sum)

if(temp.size()==kk) //個數已經超了,結束

return;

for(int i=pos;i<10;i++)}};

題目

給定乙個由正整數組成且不存在重複數字的陣列,找出和為給定目標正整數的組合的個數。

示例:nums = [1, 2, 3]

target = 4

所有可能的組合為:

(1, 1, 1, 1)

(1, 1, 2)

(1, 2, 1)

(1, 3)

(2, 1, 1)

(2, 2)

(3, 1)

請注意,順序不同的序列被視作不同的組合。

因此輸出為 7。

思路動態規劃,這個確實沒想到,用遞迴結果超時了,尷尬,

優點斐波那契數列的感覺!!!

class solution 

}return dp[target];}};

12 組合模式

1.說明 請參見本文第一章 2.組合模式說明 組合模式 將物件組合成樹形介面以表示 部分 整體 的層次結構。組合模式使得使用者對單個物件和組合物件具有一致性。為了保持整體和區域性的一致性,整體和區域性具有相同的介面,從而避免判斷該節點是整體還是區域性。介面可以實現為空。使用範圍 在需求中體現部分與整...

15 組合模式

定義 將物件組合成樹形結構以表示 部門 整體 的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。適用 當發現需求中是體現部分與整體層次的結構時,以及你希望使用者可以忽略組合物件與單個物件的不同,同意地適用組合結構中的所有物件時,就應該考慮用組合模式了。asp.net的treevie...

10組合模式

組合模式 設計模式其實很簡單 筆記 定義 將物件組成樹形結構以表示 部分 整體 的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。理解 樹和子樹,即整體與部分。在樹形結構中,部分和整體有著類似或相同的結構,所以可以將部分和 整體一致對待 樹中分支節點與葉子節點的抽象父類 publi...