Combinations

来源:互联网 发布:cms app 编辑:程序博客网 时间:2024/04/29 08:36

题目名称
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: RyanDate: 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=3int 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;}

总结
  运行结果如下:

这里写图片描述

0 0
原创粉丝点击