2018.3.1 17:06 第一篇博客
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], ]這道題我用的是深度優先搜索(DFS),深度優先搜索的思維與常人的思維方式比較接近,比較容易理解,甚至在某些場合有些像(聰明的)枚舉。
示例有些過於簡單,不妨構造一個稍顯複雜的例子,如取n=6 , k=4的情況:
顯然首先第一組滿足情況的是:
① 1,2,3,4 那麼也不難有規律地寫出第二組,就是1,2,3,4 ,變成
② 1,2,3,5 可以發現有一個刪除最後一位數字的步驟,可以用DFS遞歸操作後進行pop_back()操作
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
if(n < k || k == 0) return result;
dfs(1,0,n,k);
return result;
}
private:
vector<int> solution;
vector<vector<int>> result;
void dfs(int start , int num , int n , int k)
{
if(num == k)
{
result.push_back(solution);
return;
}
for(int i = start ; i <= n ; i++)
{
solution.push_back(i);
dfs(++start,num+1,n,k);
solution.pop_back();
}
}
};
值得注意的是dfs(++start,num+1,n,k); ++start不能改成start+1,如果改成start+1,在遞歸返回的時候,會發生重複,具體部分情況如下圖所示: 這裏的[1,2,3,X](X代表比3大的數),遞歸返回到[1,2,4,Y]的時候發生了問題,由於start+1在返回時start不會改變,所以這裏start=3,故再次進入遞歸時候Y依舊從4開始,如果改成++start,返回後的start=4,故再次進入遞歸時候Y會從5開始,從而避免了重複。