LeetCode 스크랩북 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] .
Permutation 문제와 쓰기 차이가 많지 않다. 유일하게 덧붙여야 할 점은 먼저 수조를 순서대로 배열한 다음에 인접한 두 원소가 같다면 두 번째 원소는 이전 원소가 사용된 후에야 사용할 수 있다.
예를 들어 1, 1, 2, 배열할 때 첫 번째 1이 소용없으면 두 번째 1을 사용하면 반드시 중복된다.
public class Solution {
    public List<List<Integer>> permuteUnique(int[] num) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        if(num == null || num.length == 0)
            return res;
        Arrays.sort(num);
        boolean[] used = new boolean[num.length];
        helper(num, res, new ArrayList<Integer>(), used, 0);
        return res;
    }
    
    public void helper(int[] num, List<List<Integer>> res, List<Integer> sol, boolean[] used, int index){
        if(index == num.length){
            res.add(new ArrayList<Integer>(sol));
            return;
        }
        
        for(int i = 0; i < num.length; i++){
            if(used[i] == false){
                if(i > 0 && num[i] == num[i - 1] && used[i - 1] == false){
                    continue;
                }
                
                sol.add(num[i]);
                used[i] = true;
                helper(num, res, sol, used, index + 1);
                sol.remove(sol.size() - 1);
                used[i] = false;
            }
        }
    }
}

좋은 웹페이지 즐겨찾기