[LeetCode 77] Combinations(精妙的迭代)
阿新 • • 發佈:2019-01-09
題目內容
77.Combinations
Given two integers n and k, return all possible combinations of k numbers out of 1 … n.
For example,
If n = 4 and k = 2, a solution is:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
題目連結
題目簡介
寫出給定範圍整數的所有組合
題目分析
用迭代法。以全零數列開始迭代,從首元素開始進行如下迭代。
1.該數自增1。
2.若元素大於n,指標前移一位,回迴圈體頭部;
若已是末尾元素,記錄該組合;
否則把該元素的值賦給後一元素。指標後退一位返回迴圈體頭部。
實際模擬後發現該過程可視為從首元素為1,公差為1的等差數列的迭代過程。
從末尾元素開始對每個元素進行遞增,若每數均小於n且成功到達末尾元素,則記錄組合;若超出範圍則將指標後退,對前一元素進行遞增。
根據歸納法可知該方法可以不遺漏不重複地記錄所有合法組合。
程式碼示例
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int>> res;
vector<int> temp(k,0 );
int i=0;
while(i>=0)
{
temp[i]++;
if(temp[i]>n) i--;
else if(i==k-1) res.push_back(temp) ;
else
{
i++;
temp[i]=temp[i-1];
}
}
return res;
}
};