標籤:組合 分治演算法 演算法 面試 java
【077-Combinations(組合數)】
【LeetCode-面試演算法經典-Java實現】【所有題目目錄索引】
原題
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],]
題目大意
給定兩個數n和k,求從1-n中k個數的所有組合。
解題思路
採用遞迴分治法進行求解,詳見代碼。
代碼實現
演算法實作類別
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)); } }}
評測結果
點擊圖片,滑鼠不釋放,拖動一段位置,釋放後在新的視窗中查看完整圖片。
特別說明
歡迎轉載,轉載請註明出處【http://blog.csdn.net/derrantcm/article/details/47142961】
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
【LeetCode-面試演算法經典-Java實現】【077-Combinations(組合數)】