45. Permutations

Given a collection of numbers, return all possible permutations.

For example,
[1,2,3] have the following permutations:
[1,2,3][1,3,2][2,1,3][2,3,1][3,1,2], and [3,2,1].

---

参考cc150 9.5

O(N!) N factorial

---

1. Interation

 

public class Solution {
    public ArrayList<ArrayList<Integer>> permute(int[] num) {
        
        ArrayList<ArrayList<Integer>> rst = new ArrayList<ArrayList<Integer>>();
        rst.add(new ArrayList<Integer>());
        
        for(int i=0;i<num.length;i++){
            
            ArrayList<ArrayList<Integer>> cur = new  ArrayList<ArrayList<Integer>>();
            
            // every sublist
            for(ArrayList<Integer> sublist:rst){
                for(int j=0;j<=sublist.size();j++){
                    // copy
                    ArrayList<Integer> newlist= new ArrayList<Integer>(sublist);
                    // insert
                    newlist.add(j,num[i]);             
                    // add to list
                    cur.add(newlist);            
                }
            }
            
            //update rst, remove the old, add the new
            rst = new ArrayList<ArrayList<Integer>>(cur);
        }
        return rst;
    }
}

 

 2. Recursive

public class Solution {
    public ArrayList<ArrayList<Integer>> permute(int[] num) {

        if(num == null) return null;
        return helper(num, num.length-1);
    }
    
    private ArrayList<ArrayList<Integer>> helper(int[] num, int index){
    
        ArrayList<ArrayList<Integer>> rst;
        
        if(index == -1){// base case
            rst = new ArrayList<ArrayList<Integer>>();
            rst.add(new ArrayList<Integer>());
            return rst;
        }
        
        rst = helper(num, index-1);
        int item = num[index];
        ArrayList<ArrayList<Integer>>  newRst = new ArrayList<ArrayList<Integer>>();
 
        for(ArrayList<Integer> list : rst){
            for(int i=0; i<=list.size(); i++){
                ArrayList<Integer> newlist = new ArrayList<Integer>(list);
                newlist.add(i, item);
                newRst.add(newlist);
            }
            
        }
        
        return newRst;
    }
}

 

3. recursive另一种思路

public class Solution {
    public ArrayList<ArrayList<Integer>> permute(int[] num) {
        
        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();  
        ArrayList<Integer> tmp = new ArrayList<Integer>(); 

        int n = num.length;  
        boolean[] visited = new boolean[n];  
          
        helper(res, tmp, num, visited);  
          
        return res;  
    }  
    private void helper(ArrayList<ArrayList<Integer>> res, ArrayList<Integer> tmp, 
            int[] num, boolean[] visited){  
                
        if(tmp.size() == num.length){  //Done, add to rst
            res.add(new ArrayList<Integer>(tmp));  
            return;  
        }
        
        for(int i=0; i<num.length; i++){  
            if(!visited[i]){  
                tmp.add(num[i]);  
                visited[i] = true;  
                helper(res, tmp, num, visited);  
                visited[i] = false;  
                tmp.remove(tmp.size()-1);
            }  
        }  
    }  
}

 

posted @ 2013-09-06 00:46  LEDYC  阅读(156)  评论(0)    收藏  举报