题目

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~n中k个数的组合问题。

看到题目的条件反射就是暴力法依次列举解决问题,实际上这条道路应该是行不通的,即便是得到正确结果,时间复杂度也会很高。

仔细思考,这道题目可以用动态规划的思想解决:

1~n中k个数的所有组合一定是由两部分组成:

  1. 第一部分,求(1~n-1)中k-1个数的所有组合,然后每个组合中加入元素n;
  2. 第二部分,求(1~n-1)中k个数的所有组合;

上述两部分合并便可以得到1~n中k个数的所有组合。

算法设计需要注意几个问题,避免不必要的bug:

  1. 判断 n<=0 时,组合为空
  2. 判断 n<k 时(也就包括了 k<=0 的情况),组合均为空
  3. 判断 k==1 时, 1−n 每个元素为一个组合,返回 n 个组合
  4. 判断 n==k 时,此时只有一个组合,包括元素 1−n

AC代码

class Solution {
public:
vector<vector<int>> combine(int n, int k) { if (n <= 0 || n < k)
return vector<vector<int>>(); //保存结果
vector<vector<int>> ret;
if (k == 1)
{
for (int i = 1; i <= n; i++)
{
vector<int> v(1,i);
ret.push_back(v);
}//for return ret;
}//if
if (n == k)
{
vector<int> v;
for (int i = 1; i <= n; i++)
{
v.push_back(i);
}//for
ret.push_back(v); return ret;
}//if
else{
//由两部分组成,第一部分为 1~n-1 中k-1个数的组合,每个组合加入元素n
vector<vector<int>> tmp = combine(n - 1, k - 1);
int len = tmp.size();
for (int i = 0; i < len; i++)
{
tmp[i].push_back(n);
ret.push_back(tmp[i]);
}//for //第二部分,1~n-1中 k个数的组合,两部分合并得到最终结果
tmp = combine(n - 1, k);
len = tmp.size();
for (int i = 0; i < len; i++)
{
ret.push_back(tmp[i]);
}//for return ret;
}//else
}
};

GitHub测试程序源码

最新文章

  1. 163邮箱问题:554 DT:SPM 163 smtp5,D9GowACHO7RNWNdXmXs1Bw--.9035S2
  2. 说说Web.Config与App.Config
  3. 打包app命令行
  4. 反转(开关问题) POJ 3276
  5. 向架构师进军---&amp;gt;怎样编写软件架构文档
  6. Mysql MERGE 引擎在分表环境下得使用
  7. C++内置类型对象之间的转换
  8. 用gradle管理android项目出现的问题以及解决方法
  9. Oracle sql 中的字符(串)替换与转换[转载]
  10. perl中my和our的区别分析
  11. 暑假练习赛 004 E Joint Stacks(优先队列模拟)
  12. hotspot虚拟机的调试
  13. c++友元函数与友元类
  14. Git命令行管理代码、安装及使用
  15. 编译&amp;链接笔记
  16. 深入理解kafka设计原理
  17. js 过滤日期格式
  18. activiti实战--第一章--认识Activiti
  19. golang之包和锁的机制
  20. Mac Sublime Text3快捷键

热门文章

  1. Adding New Machine ZOJ - 3540
  2. JSP文件过大无法编译
  3. vmware虚拟机启动centOs黑屏
  4. imagettftext
  5. Android中ProgressBar显示小数的方法
  6. markdown快捷键(转)
  7. CF778B(round 402 div.2 E) Bitwise Formula
  8. ios MD5大小写加密
  9. 数据库系统概论(2)——Chap. 2 关系数据库基础
  10. 什么是python 中的顶层代码?