1. 程式人生 > >[LeetCode 77] Combinations(精妙的迭代)

[LeetCode 77] Combinations(精妙的迭代)

題目內容

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; } };