力扣演算法題 077組合

2022-06-04 01:12:09 字數 2643 閱讀 1291

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

示例:

輸入: n = 4, k = 2

輸出:[

[2,4],

[3,4],

[2,3],

[1,2],

[1,3],

[1,4],

]

1 #include "

_000庫函式.h"2

34//就是排列組合問題5//

但是是按順序選,感覺很簡單

6class

solution ;

10 vectorint>>res;

11 vectornum;

12for (int i = 0; i < n; ++i)num.push_back(i + 1

);13 vectorindex(k, 1);//

令標記位前三個為選中狀態

14 index.insert(index.end(), n - k, 0);//

後面的 數字未被選中

15 res.push_back(print(index, num));//

儲存資料

1617

while (!hasdone(index, n, k))

1837

}38 res.push_back(print(index, num));//

儲存資料

39break;40

}41}42

}43return

res;44}

45 vector print(vectorindex, vectornum)

5152

//檢查最後k個位置是否已全變成0

53bool hasdone(vectorindex, int n, int

k)54

59};

6061

62//

使用深度搜尋策略

63class

solution ;

67 vectorint>>res;

68 vectorv;

69 helper(n, k, 1

, v, res);

70return

res;71}

7273

void helper(int n, int k, int level, vector&v, vectorint>>&res)

78for (int i = level; i <= n; ++i) 83}

84};

8586

//我們再來看一種遞迴的寫法,此解法沒用helper當遞迴函式,

87//

而是把本身就當作了遞迴函式,寫起來十分的簡潔,也是非常有趣的一種解法。

88//

這個解法用到了乙個重要的性質 c(n, k) = c(n - 1, k - 1) + c(n - 1, k),

89//

這應該在我們高中時候學排列組合的時候學過吧,博主也記不清了。

90//

總之,翻譯一下就是,在n個數中取k個數的組合項個數,

91//

等於在n - 1個數中取k - 1個數的組合項個數再加上在n - 1個數中取k個數的組合項個數之和。

92//

這裡博主就不證明了,因為我也不會,就直接舉題目中的例子來說明吧:

93//

c(4, 2) = c(3, 1) + c(3, 2)

94//

我們不難寫出 c(3, 1) 的所有情況:[1], [2], [3],

95//

還有 c(3, 2) 的所有情況:[1, 2], [1, 3], [2, 3]。

96//

我們發現二者加起來為6,正好是 c(4, 2) 的個數之和。

97//

但是我們仔細看會發現,c(3, 2)的所有情況包含在 c(4, 2) 之中,

98//

但是 c(3, 1) 的每種情況只有乙個數字,而我們需要的結果k = 2,

99//

其實很好辦,每種情況後面都加上4,於是變成了:[1, 4], [2, 4], [3, 4],

100//

加上c(3, 2) 的所有情況:[1, 2], [1, 3], [2, 3],正好就得到了 n = 4, k = 2 的所有情況了。

101//

參見**如下:

102103

class

solution ;

107if (k == 0)return

};108 vectorint>>res = combine(n - 1, k - 1

);109

for (auto &a : res)a.push_back(n);

110for (auto &a : combine(n - 1

, k))res.push_back(a);

111return

res;

112}

113};

114115

116117

void

t077()

126 }

力扣39 組合總和

給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。有時候剪枝不止需要加上附加條件,還需要對原有資料集進行改動,比如排序。class solution ...

力扣日記 039 組合總和 回溯演算法

給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。解集不能包含重複的組合。第一次做回溯演算法,磨磨唧唧乙個多小時總歸做出來了。class soluti...

力扣40組合綜合II

對candidates進行遞減排序,從最大的元素開始依次與target進行比較 有三種情況出現 1,元素 target 該元素不可選,跳過該元素 2,元素 target 選擇該元素後,所構成的乙個vec元素組合之和滿足等於target 3,元素 需要注意的地方 什麼時候從vec的放入元素和拿出元素。...