Combinations

Mar 31, 2016


Combinations

题目描述

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], ]

解法

代码如下:

public static List<List<Integer>> combine( int n, int k ) {
    List<List<Integer>> res = new ArrayList<>();
    helperCombine( n, 1, k, new ArrayList<Integer>(), res );
    return res;
}
public static void helperCombine( 
        int n, int t, int k, List<Integer> tmpRes, List<List<Integer>> res ) {
    // 约束条件
    if( t > n ) {
        return;
    }
    // 不选取当前值
    helperCombine( n, t+1, k, tmpRes, res );
    
    // 选取当前值
    tmpRes.add( t );
    if( k-1 == 0 ) {    // 获得一个结果
        res.add( new ArrayList<Integer>(tmpRes) );
    } else {            // 进入下一层
        helperCombine( n, t+1, k-1, tmpRes, res );
    }
    tmpRes.remove( tmpRes.size()-1 );
}

思考过程: 回溯法. 对于[1…n]中的每一个元素, 可取可不取

时空复杂度: 时间复杂度是O(2^n), 空间复杂度是O(n): 递归的空间, 排除构造出来的结果集

总结

约束条件放在方法头部更容易理解


上一篇博客:CombinationSum(II)(III)
下一篇博客:动态规划原理学习笔记