问题描述:
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], ]
基本思想:
回溯法
代码:
vector<int> record; //C++ vector<vector<int> >result; set<vector<int> > myset; int kNum = 0; void addSolution(){ vector<int> tmp(record.begin(),record.end()); sort(tmp.begin(),tmp.end()); if(myset.find(tmp) == myset.end()){ result.push_back(tmp); myset.insert(tmp); } } void subCombinationSum(vector<int> &cadidates,int bpos,vector<int> &base, int k){ if(kNum == k){ addSolution(); } int size = cadidates.size(); for(int i = bpos; i < size; i++){ if(base[i] == 1) continue; record.push_back(cadidates[i]); base[i] = 1; kNum++; subCombinationSum(cadidates,<span style="color:#FF0000;"><strong>i+1</strong></span>,base,k); //i+1 避免重复 record.pop_back(); base[i] = 0; kNum--; } } vector<vector<int> > combine(int n, int k) { vector<int> candidates(n); for(int i = 0; i < n; i++) candidates[i] = i+1; vector<int> base(candidates.size(),0); subCombinationSum(candidates,0,base,k); return result; }
时间: 2024-12-23 14:09:21