【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 ...
随机推荐
- Hibernate笔记2
一.持久化类 1.持久化标识OID 数据库中叫做主键,对应实体的ID属性即为OID;Hibernate通过OID区分两个对象是否为同一对象;OID的生成一般交由程序自动处理; 2.持久化类 ...
- TX Text Control X10独家揭秘之使用对象作为数据源
文档处理控件TX Text Control即将发布的X10版本,将升级重点还是放到了其比较优势的流式布局报表设计和生成上.慧都获得了来自其开发商Text Control GmbH公司的一手资料,迫不及 ...
- sublimetext3安装配置
官网:http://www.sublimetext.com/ 中文官网:http://www.sublimetextcn.com/ 包管理器:https://packagecontrol.io/ins ...
- jQuery-动画animate() 方法操作 CSS 属性
语法: $(selector).animate({params},speed,callback); 多个params 之间用逗号(,)隔开. 必须使用 Camel 标记法书写所有的属性名,比如,必须使 ...
- LeetCode Remove Duplicates from Sorted Array II 删除整型数组中的重复元素并返回剩下元素个数2
class Solution { public: int removeDuplicates(int A[], int n) { ],*e=&A[]; //s指向“连续数字”的第一个,e往后遍历 ...
- Head First HTML与CSS阅读笔记(二)
上一篇Head First HTML与CSS阅读笔记(一)中总结了<Head First HTML与CSS>前9章的知识点,本篇则会将剩下的10~15章内容进行总结,具体如下所示. div ...
- 简析平衡树(一)——替罪羊树 Scapegoat Tree
前言 平衡树在我的心目中,一直都是一个很高深莫测的数据结构.不过,由于最近做的题目的题解中经常出现"平衡树"这三个字,我决定从最简单的替罪羊树开始,好好学习平衡树. 简介 替罪羊树 ...
- pip 安装出现异常
MacBookPro:~ mac$ pip install numpy Collecting numpy Downloading numpy-1.13.1-cp35-cp35m-macosx_10_6 ...
- 三种序列化方式存取redis的方法
常见的的序列化反序列方式的效率: protoBuf(PB) > fastjson > jackson > hessian > xstream > java 数据来自于:h ...
- ubuntu install oracle jdk
.Download the required tarball from here .unzip this tarball using "tar -zxvf tarball_name .cre ...