給定兩個整數 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的放入元素和拿出元素。...