【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 ...
随机推荐
- 360 so动态脱壳
环境及工具 手机 : 中兴 U887 系统版本: Android 2.3.5 工具 : IDA pro 6.6 .0101Editor 版权声明:未经许可,随便转载 目前so加壳有 ...
- 关于dom4j在maven中的使用
在maven中添加dom4j的依赖, (如何使用eclipse构建maven项目, 这里就不在赘述) <!-- https://mvnrepository.com/artifact/org.do ...
- oracle最高账号sys的密码认证模式
CONNECT USERNAME/PASSWORD@SERVERNAME AS SYSDBAconnect 是指连接到username是指用户名password是指密码servername是指服务名a ...
- 自己实现的简单的grid
12年在第一家公司的时候,有过很长一段时间在前端的使用研究上.一开始的时候使用ExtJs4.0 MVC 来开发前端,觉得里面的风转的组件非常好用,Panel.window.tree等等,简化了对于前端 ...
- shell实现mysql数据库备份
#!/bin/bash DB_USER="root" #数据库用户名 DB_PASS="12345678" #数据库密码 BACK_DIR="/bac ...
- Android(java)学习笔记78:Java类初始化顺序
1. Java类中初试化的顺序: 由此得出Java普通类初始化顺序结论: (1)静态变量 (2)静态初始化块 (3)变量 (4)初始化块 (5)构造器 由此得出Java继承类初始化顺序结论: (1)继 ...
- 面试中常见的 MySQL 考察难点和热点
基本架构 MySQL是典型的三层架构模式,在平常使用中对MySQL问题排查和优化,也应该针对具体问题,从对应的层解决问题 服务层:经典的C/S架构,主要是处理连接和安全验证. 核心层:处理MySQL核 ...
- Angular6中[ngClass]、[ngStyle]的基本使用
1.ngStyle 基本用法 <div [ngStyle]="{'background-color':'green'}"></<div> 判断添加 & ...
- 阿里云服务器下安装LAMP环境(CentOS Linux 6.3) 安装与配置 FTP 服务器
我们经常会使用 FTP,把本地电脑上的文件上传到服务器上,或者把服务器上的文件下载到自己的电脑里面.FTP 有服务端和客户端,FTP 的服务端提供了这种传输文件的服务,FTP 的客户端提供了传输文件的 ...
- HTML <input> 标签如何屏蔽浏览器的自动填写?
autocomplete = "off",实测无效. <input type="text" autocomplete = "off"/ ...