题目名称
Merge Sorted Array—LeetCode链接
描述
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],
]
分析
这道题是组合问题,典型的回溯法问题,求出所有可行解,例如,当n=3时,问题的解空间为{ ( ), (1), (2), (3), (1, 2), (1, 3), (2, 3), (1, 2, 3)} ,根绝约束条件k的取值就能找出所有的可行解。
C++代码
/*************************************************
Copyright: 武汉大学计算机学院B507
Author: Ryan
Date: 2015-11-19
Description: Combinations:Given two integers n and k,
return all possible combinations of k numbers out of 1 ... n.
**************************************************/
#include<iostream>
#include<vector>
using namespace std;
//一个重载的函数combine,这里是函数申明
void combine(vector<vector<int> > &res,vector<int> &temp,int start,int num,int n ,int k);
vector<vector<int> > combine(int n, int k) {
vector<vector<int> >res;
if(n<k)return res;
vector<int> temp(0,k);
combine(res,temp,0,0,n,k);
return res;
}
/*
* 参数说明:
* res为所有解的向量;
* temp表示一个可行解;
* start表示每次搜索的子树根节点;
* num表示已经搜索到的节点数目。
* 约束函数:num==k,这里表示已经搜索到了k个节点
*/
void combine(vector<vector<int> > &res,vector<int> &temp,int start,int num,int n ,int k){
if(num==k){
res.push_back(temp);
return;
}
for(int i = start;i<n;i++){
temp.push_back(i+1);
combine(res,temp,i+1,num+1,n,k);
temp.pop_back();
}
}
//测试用例:n=4,k=3
int main() {
int n=4,k=3;
vector<vector<int> > res = combine(n,k);
cout<<"["<<endl;
for(int i=0;i<res.size();i++) {
cout<<" [";
for(int j=0;j<res[i].size();j++) {
cout<<" "<<res[i][j];
}
cout<<" ]"<<endl;
}
cout<<"]"<<endl;
return 0;
}
总结
运行结果如下: