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:java
[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
給定兩個數n和k,求從1-n中k個數的全部組合。算法
採用遞歸分治法進行求解,詳見代碼。spa
算法實現類.net
import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; public class Solution { private List<List<Integer>> result; private List<Integer> l; public List<List<Integer>> combine(int n, int k) { result = new LinkedList<>(); if (n > 0 && k > 0 && n >= k) { l = new LinkedList<>(); combine(1, n, k); } return result; } /** * 求組合 * * @param start 可選擇的數開始位置 * @param end 可選擇的數的結束位置 * @param num 在[start, end]中選擇的數的數目 */ private void combine(int start, int end, int num) { if (num == 0) { List<Integer> tmp = new ArrayList<>(); for(Integer i: l) { tmp.add(i); } result.add(tmp); return; } int endFirst = end - num + 1; // 第一個數能夠選擇的最大值 for (int i = start; i <= endFirst; i++) { l.add(i); combine(i + 1, end, num - 1); l.remove(new Integer(i)); } } }