【Combinations】cpp
题目:
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],
]
代码:
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int> > ret;
if ( n<k ) return ret;
vector<int> tmp;
Solution::dfs(ret, , k, n, ,tmp);
return ret;
}
static void dfs(vector<vector<int> >& ret, int index, int k, int n, int step, vector<int>& tmp)
{
if ( step==k )
{
ret.push_back(tmp);
return;
}
for ( size_t i = index; i <=n; ++i )
{
tmp.push_back(i);
Solution::dfs(ret, i+, k, n, step+, tmp);
tmp.pop_back();
}
}
};
tips:
dfs解法。
几个参数的含义:
ret: 存储返回combination结果
index: 当前起始元素是多大
k,n:与题意所给相同
step:深入到第几层
思路:dfs的每层增加一个元素,直到深度等于k返回结果;如果从index开始的元素不足以打到深度k,则不会添加到ret中。
======================================
其实,可以不用传入6个参数,传入5个足以。代码如下:
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int> > ret;
if ( n<k ) return ret;
vector<int> tmp;
Solution::dfs(ret, , k, n, tmp);
return ret;
}
static void dfs(vector<vector<int> >& ret, int index, int k, int n, vector<int>& tmp)
{
if ( tmp.size()==k )
{
ret.push_back(tmp);
return;
}
for ( size_t i = index; i <=n; ++i )
{
tmp.push_back(i);
Solution::dfs(ret, i+, k, n, tmp);
tmp.pop_back();
}
}
};
用tmp.size()代替step,代码跟简洁一些,因此更推崇后一种方法。
=======================================
leetcode写到这里有些感觉了,搜了一下dfs bfs的模板相关的内容,基本跟实战中的经验差不多:
http://blog.csdn.net/fightforyourdream/article/details/12866861
http://www.cnblogs.com/HectorInsanE/archive/2010/11/09/1872656.html
=======================================
再补上一种迭代的解法,如下:
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int> > ret;
// corner cases
if ( n<k || k== ) return ret;
// initialization
for ( int i = ; i < n-k+; ++i )
{
vector<int> tmp;
tmp.push_back(i+);
ret.push_back(tmp);
}
// combines
for ( int i = ; i < k-; ++i )
{
vector<vector<int> > tmp = ret;
ret.clear();
for ( int j = ; j < tmp.size(); ++j )
{
int curr = tmp[j].back();
for ( int v = curr+; v <= n; ++v )
{
vector<int> ori = tmp[j];
ori.push_back(v);
ret.push_back(ori);
}
}
}
return ret;
}
};
tips:
1. 这种迭代方式返回的组合内部都是由小到大排序的。
2. intialization的含义是”组合首个元素最小到最大“(比如n=4,k=2 按照原则1,则首个元素最大取到3,因为比4小的元素没有了不足以满足k=2的条件)
3. 每轮迭代,先取出来当前组合最后一个元素(最大的)curr;再从curr+1到n挨个取值,补到tmp[j]的后面,构成新的组合。
4. 控制迭代的次数是k-1次(因为initialization已经算了一次)
===============================================
第二次过这道题,用dfs过的,传入参数比第一次过更简洁一些。
class Solution {
public:
vector<vector<int> > combine(int n, int k)
{
vector<vector<int> > ret;
vector<int> tmp;
Solution::dfs(ret, tmp, n, k);
return ret;
}
static void dfs(
vector<vector<int> >& ret,
vector<int>& tmp,
int n, int k)
{
if ( tmp.size()==k )
{
ret.push_back(tmp);
return;
}
int index = tmp.empty() ? : tmp.back();
for ( int i=index+; i<=n; ++i )
{
tmp.push_back(i);
Solution::dfs(ret, tmp, n, k);
tmp.pop_back();
}
}
};
【Combinations】cpp的更多相关文章
- 【Permutations】cpp
题目: Given a collection of numbers, return all possible permutations. For example,[1,2,3] have the fo ...
- 【Subsets】cpp
题目: Given a set of distinct integers, nums, return all possible subsets. Note: Elements in a subset ...
- 【Anagrams】 cpp
题目: Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will ...
- 蓝桥杯 【dp?】.cpp
题意: 给出一个2*n的方格,当刷完某一个方格的漆后可以且只可以走到相邻的任何一格,即上 下 左 右 左上 左下 右上 右下.可以从任意一个格子开始刷墙,问有多少种刷法,因为随着n的增大方案数会变多, ...
- 【Triangle 】cpp
题目: Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjace ...
- 【N-Queens】cpp
题目: The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two que ...
- 【Candy】cpp
题目: There are N children standing in a line. Each child is assigned a rating value. You are giving c ...
- 【4Sum】cpp
题目: Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = ...
- 【3Sum】cpp
题目: Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find al ...
随机推荐
- JAXB介绍一
参考博客: https://www.cnblogs.com/chenbenbuyi/p/8283657.html https://www.cnblogs.com/cnsdhzzl/p/8390514. ...
- iOS-加载数据的实现-MJRefresh
使用CocoaPods加载三方库: pod 'MJRefresh' MJRefresh类结构图: 具体实现方法和效果图: The drop-down refresh 01-Default self.t ...
- 网页游戏中PK系统的实现
在游戏开发过程中,写过一个简单的PK系统面板,涉及到前端和后端的交互,我将自己制作的流程分享给大家,大概流程是这样:前端发送PK邀请给后端,后端受到请求后将信息返回给前端处理,先来看下整个流程图及思路 ...
- ansible基本操作
ansible优点:redhat自带工具,可通过rpm或yum直接安装:客户端免安装:操作通过ssh验证操作:可以通过自定义hosts文件对可操作主机进行分类,方便批量操作 #ansible操作格式, ...
- Android商城开发系列(十三)—— 首页热卖商品布局实现
热卖商品布局效果如下图: 这个布局跟我们上节做的推荐是一样的,也是用LinearLayout和GridView去实现的,新建一个hot_item.xml,代码如下所示: <?xml versio ...
- Nginx+Keepalived双主轮询负载均衡
双主模式使用两个VIP,前段有2台服务器,互为主从,两台服务器同时工作,不存在资源浪费情况.同时在前端的DNS服务器对网站做多条A记录,实现了Nginx的负载均衡,当一台服务器故障时候,资源会转移到另 ...
- Python http
# import httplib # http_client = None # http_client = httplib.HTTPConnection('localhost', 8080, time ...
- hbase查询基于标准sql规范中间件Phoenix
Phoenix是个很好的hbase 查询工具,在hbase中安装也很简单,可以按照 http://www.cnblogs.com/laov/p/4137136.html 这个连接中进行配置客户端和服务 ...
- 123apps-免费网络应用
前言 在Jianrry`s博客看见推荐这个网址,试用了一下感觉还不错.主要是完全免费!!就当备用吧 网站介绍 123apps 网站地址:https://123apps.com/cn/ 旗下网站: PD ...
- SyntaxHighlighter使用方法
原名:SyntaxHighlighter,是一款用于web页面的代码着色工具,可以用来着色多种语言,可以是HTML,CSS,Javascript,还可以是C,JAVA等编程语言.最早见于Yahoo的Y ...