2014年5月11日星期日

Loop Recursive Solution - Permutations ***

As the return type is list, so load the array into a list first.

Loop the list, and use each element joins the results from recursive call to the remaining list, and Remember to add the 'deleted' element back for next iteration call.

public class Solution {
   // Set<int[]> processed = new HashSet<int[]>();
    public ArrayList<ArrayList<Integer>> permute(int[] num) {
        if(num == null || num.length == 0){
            return new ArrayList<ArrayList<Integer>>();
        }
        ArrayList<Integer> input = new ArrayList<Integer>();
        for(int i = 0; i < num.length; i++){
            input.add(num[i]);
        }
     
        return permuteOps(input);
    }
 
    private ArrayList<ArrayList<Integer>> permuteOps(ArrayList<Integer> inputs){
        if(inputs == null || inputs.size() == 0){
            return new ArrayList<ArrayList<Integer>>();
        }
        ArrayList<ArrayList<Integer>> results = new ArrayList<ArrayList<Integer>>();
        int size = inputs.size();
        for(int i = 0; i < size; i++){
            int deleted = inputs.remove(i);
            ArrayList<ArrayList<Integer>> preResults = permuteOps(inputs);
            if(preResults.size() == 0){
                ArrayList<Integer> oneResult = new ArrayList<Integer>();
                oneResult.add(deleted);
                results.add(oneResult);
            }else{
                for(int j = 0; j < preResults.size(); j++){
                    preResults.get(j).add(0, deleted);
                }
                results.addAll(preResults);
            }
            inputs.add(i, deleted);
        }
        return results;
     
    }
}


public class Solution {
    public ArrayList<ArrayList<Integer>> permute(int[] num) {
        ArrayList<ArrayList<Integer>> results = new ArrayList<ArrayList<Integer>>();
        perm(results, num, 0, num.length - 1);
        return results;
    }
 
    private void perm(ArrayList<ArrayList<Integer>> results, int[] num, int k, int n){
        if(k == n){
            ArrayList<Integer> result = new ArrayList<Integer>();
            for(int i = 0; i < num.length; i++){
                result.add(num[i]);
            }
            results.add(result);
        }else{
            for(int i = k; i <= n; i++){
                if(isSwap(num, k, i)){
                    continue;
                }
                int temp = num[i];
                num[i] = num[k];
                num[k] = temp;
             
                perm(results, num, k + 1, n);
             
                temp = num[i];
                num[i] = num[k];
                num[k] = temp;
            }
        }
    }
 
    private boolean isSwap(int[] num, int k, int i){
        for(int j = k; j < i; j++){
            if(num[j] == num[i]){
                return true;
            }
        }
        return false;
    }
 
    // public ArrayList<ArrayList<Integer>> permute(int[] num) {
    //     if(num == null || num.length == 0){
    //         return new ArrayList<ArrayList<Integer>>();
    //     }
    //     ArrayList<Integer> input = new ArrayList<Integer>();
    //     for(int i = 0; i < num.length; i++){
    //         input.add(num[i]);
    //     }
     
    //     return permuteOps(input);
    // }
 
    // private ArrayList<ArrayList<Integer>> permuteOps(ArrayList<Integer> inputs){
    //     if(inputs == null || inputs.size() == 0){
    //         return new ArrayList<ArrayList<Integer>>();
    //     }
    //     ArrayList<ArrayList<Integer>> results = new ArrayList<ArrayList<Integer>>();
    //     int size = inputs.size();
    //     for(int i = 0; i < size; i++){
    //         int deleted = inputs.remove(i);
    //         ArrayList<ArrayList<Integer>> preResults = permuteOps(inputs);
    //         if(preResults.size() == 0){
    //             ArrayList<Integer> oneResult = new ArrayList<Integer>();
    //             oneResult.add(deleted);
    //             results.add(oneResult);
    //         }else{
    //             for(int j = 0; j < preResults.size(); j++){
    //                 preResults.get(j).add(0, deleted);
    //             }
    //             results.addAll(preResults);
    //         }
    //         inputs.add(i, deleted);
    //     }
    //     return results;
     
    // }
}

没有评论: