77. Combinations

Posted skillking

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了77. Combinations相关的知识,希望对你有一定的参考价值。

一、题目

  1、审题

技术分享图片

  2、分析

    给出整数 n,整数 k,求 1~n 之间的 k 个数字的所有组成。

 

二、解答

  1、思路:

    方法一、运用 DFS 方法。

public List<List<Integer>> combine(int n, int k) {
        
        
        List<List<Integer>> resultList  = new ArrayList<List<Integer>>();
        
        helper(resultList, new ArrayList<Integer>(), 1, n, k);
        
        
        return resultList;
    }
    
    private void helper(List<List<Integer>> resultList,
            ArrayList<Integer> arrayList, int startIndex, int maxVal, int num) {
        
        if(num == 0) {
            resultList.add(new ArrayList<>(arrayList));
            return;
        }
        
        for (int i = startIndex; i <= maxVal; i++) {
            arrayList.add(i);
            helper(resultList, arrayList, i+1, maxVal, num - 1);
            arrayList.remove(arrayList.size()-1);
        }
        
    }

  

  方法二、f(n, k) = f(n-1, k-1) + f(n-1, k) 

    即: k 个数字中选了 数字 n 和 k 个数字中未选取数字 n 两种情况。

public List<List<Integer>> combine2(int n, int k) {
        
        List<List<Integer>> resultList  = new ArrayList<List<Integer>>();
        if(k == n || k == 0) {
            List<Integer> row = new LinkedList<>();
            for (int i = 1; i <= n; i++) 
                row.add(i);
            resultList.add(row);
            return resultList;
        }
        
        // n is selected;
        resultList = combine(n - 1, k - 1);
        for(List<Integer> list: resultList)
            list.add(n);
        // n is not selected;
        resultList.addAll(combine(n-1, k));
        
        return resultList;
    }

 

以上是关于77. Combinations的主要内容,如果未能解决你的问题,请参考以下文章

[Lintcode]152. Combinations/[Leetcode]77. Combinations

leetcode-Combinations-77

77. Combinations

77. Combinations

leetcode 77. Combinations 组合(中等)

77. Combinations