Permutation I

Given a list of numbers, return all possible permutations.

Notice

You can assume that there is no duplicate numbers in the list.

For nums =[1,2,3], the permutations are:

[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

Solution: Deep first search(Backtracking)

public ArrayList<ArrayList<Integer>> permute(ArrayList<Integer> nums) {
        // write your code here
        if(nums == null)
            return new ArrayList<>();
        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
        ArrayList<Integer> item = new ArrayList<Integer>();
        boolean[] visited = new boolean[nums.size()];
        dfs(nums, res, item, visited);
        return res;
    }
    public void dfs(ArrayList<Integer> nums,
                                 ArrayList<ArrayList<Integer>> res,
                                 ArrayList<Integer> item,
                                 boolean[] visited)
    {
        if(item.size() == nums.size()) {
            res.add(new ArrayList<>(item));
            return ;
        }
        for(int i = 0; i < nums.size(); i++) {
            if(visited[i])
                continue;
            item.add(nums.get(i));
            visited[i] = true;
            dfs(nums, res, item, visited);
            visited[i] = false;
            item.remove(item.size() - 1);       
        }
    }

Permutations II

Given a list of numbers with duplicate number in it. Find all unique permutations.

Solution: Skip duplicate numbers.

public ArrayList<ArrayList<Integer>> permute(ArrayList<Integer> nums) {
        // write your code here
        if(nums == null)
            return new ArrayList<>();
        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
        ArrayList<Integer> item = new ArrayList<Integer>();
        boolean[] visited = new boolean[nums.size()];
        dfs(nums, res, item, visited);
        return res;
    }
    public void dfs(ArrayList<Integer> nums,
                                 ArrayList<ArrayList<Integer>> res,
                                 ArrayList<Integer> item,
                                 boolean[] visited)
    {
        if(item.size() == nums.size()) {
            res.add(new ArrayList<>(item));
            return ;
        }
        for(int i = 0; i < nums.size(); i++) {
            //first number must be first use
            if(i > 0 && nums.get(i) == nums.get(i - 1) && !visited[i - 1]) {
                continue;
            }
            if(visited[i])
                continue;
            item.add(nums.get(i));
            visited[i] = true;
            dfs(nums, res, item, visited);
            visited[i] = false;
            item.remove(item.size() - 1);       
        }
    }

results matching ""

    No results matching ""