【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 ...
随机推荐
- nginx 中 root和alias
根本区别 一个请求的url= http://ip:port/path 在location中配置root和alias的区别: root是在location的正则之前拼接了路径 alias是在locati ...
- 【Android开发笔记】Android Splash Screen 启动界面
public class SplashActivity extends Activity { @Override protected void onCreate(Bundle savedInstanc ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:0.概述
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 序言 帖主和队友仿制了一个简单版的微信,其中,队友是用Unity3D做前段,帖主用Java的Mina.Hiberna ...
- python之字符串切割
Python中split()函数,通常用于将字符串切片并转换为列表. 一.函数说明: split():语法:str.split(str="",num=string.count(st ...
- Centos install ICU, INTL for php
1. Install ICU from source wget http://download.icu-project.org/files/icu4c/56.1/icu4c-56_1-src.tgz ...
- ADO.net数据访问方法
ADO.NET是一组用于和数据源进行交互的面向对象的类库. 核心组件有两个: DataSet 是 ADO.NET 的非连接(断开)结构的核心组件.DataSet 的设计目的很明确:为了实现独立于任何数 ...
- 机器学习-octave使用
1 == 2 % false 1 ~=2 % true % 隐藏版本,只显示>> . PS1('>> '); % 输出两位小数格式 disp(sprintf('2 ...
- Python开发第二篇
运算符 1.算术运算符 % 取余运算符,返回余数 ** 幂运算符 //返回商的整数部分 2.逻辑运算符 and 与运算符 a and b 如果a为False是,表达式为False,如果a为True返 ...
- Drupal常用的模块
CCK (Content Construction Kit ) : 添加字段模块 Views:生成列表 Tinymce:(Wysiwyg Editor) 常用的编辑器之一 Ajax Form Buil ...
- 【6.20校内test】
反正考的不是很好吧,赶脚炸了啊qwq 然后这两天一直在忙一些神奇的事情,所以没有整理完 手动@water_lift T1:大美江湖: [题目背景] 细雪飘落长街,枫叶红透又一年 不只为故友流连,其实我 ...