码迷,mamicode.com
首页 > 其他好文 > 详细

77. Combinations

时间:2018-09-22 23:46:23      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:list   tin   nat   add   turn   link   dfs   return   sele   

一、题目

  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

标签:list   tin   nat   add   turn   link   dfs   return   sele   

原文地址:https://www.cnblogs.com/skillking/p/9691590.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!