[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/arjunmullick/Interview/master/PermutationsII.java [Back]  [Original]

package com.leetcode;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
    Example 1:

    Input: nums = [1,1,2]
    Output:
    [[1,1,2],
     [1,2,1],
     [2,1,1]]
     
    Example 2:
    
    Input: nums = [1,2,3]
    Output: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
**/
public class PermutationsII {

    class Solution {
        public List permuteUnique(int[] nums) {

            List result = new ArrayList();
            List list = new ArrayList();//first list
            for (int n : nums) {
                list.add(n);
            }
            backtrack(0, nums, list, result);
            return result;
        }

        public void backtrack(int index, int[] nums, List list, List result) {
            if (index == list.size() && !result.contains(list)) { // last tree branch issue
                //the recursion start swaping from last element
                result.add(new ArrayList(list));//copy and add
            }
            for (int i = index; i < nums.length; i++) {
                swap(list, index, i);//swap all other with this index
                backtrack(index + 1, nums, list, result);
                swap(list, index, i);//reset
            }
        }

        private void swap(List list, int index1, int index2) {
            int temp = list.get(index1);
            list.set(index1, list.get(index2));
            list.set(index2, temp);
        }
    }

    //Alternate Optimized
    class Solution2 {
        public List permuteUnique(int[] nums) {
            List res = new ArrayList();
            Arrays.sort(nums);
            boolean[] visited = new boolean[nums.length];
            helper(nums, res, new ArrayList(), visited);
            return res;
        }
        public void helper(int[] nums, List res, List ans, boolean[] visited) {
            if (ans.size() == nums.length) {
                res.add(new ArrayList(ans));
                return;
            }
            for (int i = 0; i < nums.length; i++) {
                if (visited[i] || i > 0 && nums[i] == nums[i - 1] && !visited[i - 1]) {
                    continue;
                }
                ans.add(nums[i]);
                visited[i] = true;
                helper(nums, res, ans, visited);
                ans.remove(ans.size() - 1);
                visited[i] = false;
            }
        }
    }
}



Web Proxy Viewer  |  New URL  |  Original Page