77. 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],
]
---


YC 10/20 version
public class Solution {
    public ArrayList<ArrayList<Integer>> combine(int n, int k) {
        
        ArrayList<ArrayList<Integer>> rst = new ArrayList<ArrayList<Integer>>();
        ArrayList<Integer> list = new ArrayList<Integer>();
        
        helper(n, k, 0, rst, list);
        return rst;
        
    }
    
    private void helper(int n, int k, int index, ArrayList<ArrayList<Integer>> rst, ArrayList<Integer> list){
            
        if(list.size() == k){
            ArrayList<Integer> l = new ArrayList<Integer>(list);
            rst.add(l);
            return;
        }
        
        for(int i=index+1; i<=n; i++){
            list.add(i);
            helper(n, k, i, rst, list);
            list.remove(list.size()-1);
        }
    }
}

public class Solution {
    public ArrayList<ArrayList<Integer>> combine(int n, int k) {

        if(n<k) return null;
        
        ArrayList<ArrayList<Integer>> rst = new  ArrayList<ArrayList<Integer>>();       
        
        if(k==1){ // Base case
            for(int i=1;i<=n;i++){
                ArrayList<Integer> list = new ArrayList<Integer>();
                list.add(i);
                rst.add(list);
            }
            return rst;
        }
        
        // recursive
        for(int i=n;i>=k;i--){                
            for(ArrayList<Integer> list : combine(i-1,k-1)){
                list.add(i);
                rst.add(list);
            } 
        }
        return rst;       
    }
}

 

posted @ 2013-09-15 07:30  LEDYC  阅读(155)  评论(0)    收藏  举报