Sunday, February 9, 2014

Permutations II

Given a collection of numbers that might contain duplicates, return all possible unique permutations.
For example,
[1,1,2] have the following unique permutations:
[1,1,2][1,2,1], and [2,1,1].

Solution:
It is a dfs transformation question. 


public class Solution {
    public ArrayList> permuteUnique(int[] num) {
        Arrays.sort(num);
        ArrayList> result = new ArrayList>();
        ArrayList subset = new ArrayList();
        Boolean[] visited = new Boolean[num.length];

        // must!!!!!!  default value is null
        Arrays.fill(visited, Boolean.FALSE);
 
        dfs(num, result, subset, visited);
        return result;
    }
    public void dfs(int[] num, ArrayList> result, ArrayList subset, Boolean[] visited){
        if(subset.size() == num.length){
            result.add(new ArrayList(subset));
            return;
        }
        
        for(int i = 0; i < num.length; i++){
            // if two elements have same value, the previous one must be visited first
            if(visited[i] || (i > 0 && num[i] == num[i-1] && !visited[i-1]))   
                continue;
            visited[i] = true;
            subset.add(num[i]);
            dfs(num, result, subset, visited);
            subset.remove(subset.size()-1);
            visited[i] = false;
        }
    }
}

No comments:

Post a Comment