LeetCode: Combinations



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],
]
 For choosing number in a specific layer, we can use a iteration, e.g. in the first layer, we try 1-5.  While for step in another layer, we can use recursive call.  Parameters we need for a recursive call are the current combination, the combination result set, the n, the k, and the start point of iteration (e.g. if we chose 1 for the first position, start point of 2nd position is 2; while if we chose 2 for the first position, start point of second position is 3).  
Code from http://blog.csdn.net/u010500263/article/details/18435495
public ArrayList<ArrayList<Integer>> combine(int n, int k) {
ArrayList<ArrayList<Integer>> combSet = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> comb = new ArrayList<Integer>();
if(n<k) return combSet;
helper(n, k, combSet, comb, 1);
return combSet;
}
public void helper(int n, int k, ArrayList<ArrayList<Integer>> combSet, ArrayList<Integer> comb, int start){
// one possible combinition constructured
if(comb.size() == k){
combSet.add(new ArrayList<Integer> (comb));
return;
}
else{
for(int i=start; i<=n; i++){// try each possibility number in current position
comb.add(i);
helper(n, k, combSet, comb, i+1); // after selecting number for current position, process next position
comb.remove(comb.size()-1); // clear the current position to try next possible number
}
}
}
Code from http://www.darrensunny.me/leetcode-combinations/
public ArrayList<ArrayList<Integer>> combine(int n, int k) {
        ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
        if (n == 0 || k == 0)
            return result;
        recursiveCombine(n, k, 0, new Stack<Integer>(), result);
        return result;
    }
    /**
     * Recursive method for obtaining a list of combinations
     * @param n selection range [1...n]
     * @param k the number of selections needed
     * @param last last selection
     * @param current a stack containing current combination
     * @param result the list to record all combinations
     */
    private void recursiveCombine(int n, int k, int last, Stack<Integer> current,
                                  ArrayList<ArrayList<Integer>> result) {
        // No more selection is needed; put the current combination into result
        if (k == 0) {
            result.add(new ArrayList<Integer>(current));
            return;
        }
        // Separately add a number after the last selection, and work recursively
        for (int i = last+1; i <= n; i++) {
            current.push(i);
            recursiveCombine(n, k-1, i, current, result);
            current.pop();
        }
    }
Iterative Version from http://gongxuns.blogspot.com/2012/12/leetcodecombinations.html
public ArrayList<ArrayList<Integer>> combine(int n, int k) {
        // Start typing your Java solution below
        // DO NOT write main() function
        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
        if(k==0) return res;
        res.add(new ArrayList<Integer>());
        for(int i=0;i<k;i++){
             ArrayList<ArrayList<Integer>> prev = new ArrayList<ArrayList<Integer>>();
             for(ArrayList<Integer> temp:res){
                int a=0;
                if(temp.size()>0)
                    a=temp.get(temp.size()-1);
                for(int j=a+1;j<=n-k+1+i;j++){
                    ArrayList<Integer> b= new ArrayList<Integer>(temp);
                    b.add(j);
                    prev.add(b);
                }
             }
            res = new ArrayList<ArrayList<Integer>>(prev);
        }
        return res;
    }
Read full article from [leet code] Combinations - 伪技回忆录 - 博客频道 - CSDN.NET

No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts