Combinations 解答
Question
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],
]
Solution
Draw out solution tree. Given [4, 2]
[]
/ / \ \
1 2 3 4
/ | \ / \ |
2 3 4 3 4 4
According to this tree, we can write out solution.
 public class Solution {
     public List<List<Integer>> combine(int n, int k) {
         if (k > n)
             k = n;
         List<List<Integer>> result = new ArrayList<List<Integer>>();
         dfs(n, k, 1, new ArrayList<Integer>(), result);
         return result;
     }
     private void dfs(int n, int k, int start, List<Integer> list, List<List<Integer>> result) {
         if (list.size() == k) {
             result.add(new ArrayList<Integer>(list));
             return;
         }
         for (int i = start; i <= n; i++) {
             list.add(i);
             dfs(n, k, i + 1, list, result);
             list.remove(list.size() - 1);
         }
     }
 }
Conclusion -- start pointer or visited[]
总结一下Backtracking这一类常见问题。
Backtracking一般都是应对穷举来找出所有答案的问题。对于这类问题,我们常常可以画出解空间树。然后遍历解空间树就可以得到答案。
遍历可以用 BFS 也可以DFS。一般来说,用迭代实现的DFS,不用自己维护栈所以是比较方便的做法。如果用BFS,则需要纪录一系列状态值。
在迭代的时候,我们要注意迭代结束之后要回到未迭代时的状态。
1. 如果有list操作,要把list的最后一个element移出
2. 如果有visited[],重新设置该element的状态为未访问过。
对比这些题目 Permutation, PhoneNumber,我们发现有的时候用到了start指针来代替visited[]数组表明该结点都无访问过。
那什么时候用start指针,什么时候用visited[]呢?
Combinations 解答的更多相关文章
- Letter Combinations of a Phone Number 解答
		Question Given a digit string, return all possible letter combinations that the number could represe ... 
- 【LeetCode题意分析&解答】40. Combination Sum II
		Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in ... 
- 【LeetCode题意分析&解答】39. Combination Sum
		Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C wher ... 
- Cracking the coding interview--问题与解答
		http://www.hawstein.com/posts/ctci-solutions-contents.html 作者:Hawstein出处:http://hawstein.com/posts/c ... 
- Leetcode 17.——Letter Combinations of a Phone Number
		Given a digit string, return all possible letter combinations that the number could represent. A map ... 
- LeetCode OJ 77. Combinations
		题目 Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For exa ... 
- LeetCode题目解答
		LeetCode题目解答——Easy部分 Posted on 2014 年 11 月 3 日 by 四火 [Updated on 9/22/2017] 如今回头看来,里面很多做法都不是最佳的,有的从复 ... 
- LeetCode算法题目解答汇总(转自四火的唠叨)
		LeetCode算法题目解答汇总 本文转自<四火的唠叨> 只要不是特别忙或者特别不方便,最近一直保持着每天做几道算法题的规律,到后来随着难度的增加,每天做的题目越来越少.我的初衷就是练习, ... 
- Combinations
		Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For exampl ... 
随机推荐
- java cglib动态代理原理及样例
			 cglib动态代理: http://blog.csdn.net/xiaohai0504/article/details/6832990 一.原理 代理为控制要访问的目标对象提供了一种途径.当访问 ... 
- C# 文件夹操作
			追加文件 StreamWriter sw = File.AppendText(Server.MapPath(] != Path.DirectorySeparatorChar) a ... 
- PHP与C++的不同
			由于工作需要,需要学习一下PHP,由于3年的C++背景,在刚开始学习PHP的过程中,有些不习惯,经过一段时间的学习,总结了一些PHP与C++的不同. 1.应用场景 在谈两种语言不同的时候,首先需要了解 ... 
- 【HDU1162】Eddy's picture(MST基础题)
			很基础的点坐标MST,一不留神就AC了, - - !! #include <iostream> #include <cstring> #include <cstdlib& ... 
- Node.js-require的使用方法
			require最常用的方法 require('http') 内置模块 require('./server') “./”表示当前路径,后面跟的是相对路径 require("../lib/se ... 
- 【转】Alsa音频编程【精华】
			一.前序 这里了解一下各个参数的含义以及一些基本概念. 声音是连续模拟量,计算机将它离散化之后用数字表示,就有了以下几个名词术语. 样本长度(sample):样本是记录音频数据最基本的单位,计算机对每 ... 
- Android 之 ExpandableListView 的使用
			喜欢显示好友QQ那样的列表,可以展开,可以收起,在android中,以往用的比较多的是listview,虽然可以实现列表的展示,但在某些情况下,我们还是希望用到可以分组并实现收缩的列表,那就要用到an ... 
- python高级编程之装饰器04
			from __future__ import with_statement # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrat ... 
- js转换ascii编码如中文友转换为编码友;可防止乱码
- js判断是否是数字通用写法
			function isNumber(value){ var isNumber = value.match(/^(-?\d+)(\.\d+)?$/g) !=null; if(value.substrin ... 
