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