LeetCode 47 全排列II

LeetCode 47 全排列II

问题描述:
给定一个可包含重复数字的序列,返回所有不重复的全排列。

DFS

  1. 使用一个等长数组标记已使用元素

执行用时:2 ms, 在所有 Java 提交中击败了74.52%的用户
内存消耗:39.6 MB, 在所有 Java 提交中击败了40.76%的用户

/**
 * @author CodeSPA
 * @date 2020/5/28 - 10:52
 */
import java.util.LinkedList;
import java.util.Arrays;
class Solution {
    public List<List<Integer>> result = new LinkedList<>();
    public List<List<Integer>> permuteUnique(int[] nums) {
        if(nums.length == 0){
            result.add(new ArrayList<Integer>());
            return result;
        }
        //首先给数组排序
        Arrays.sort(nums);
        findUnique(nums,new boolean[nums.length],new LinkedList<Integer>());
        return result;
    }
    public void findUnique(int[] nums, boolean[] visited,LinkedList<Integer> trace){
        //结束条件
        if(trace.size() == nums.length){
            result.add(new LinkedList(trace));
            return ;
        }
        //选择列表
        for(int i = 0; i<nums.length; i++){
            //其次,我们已经选择过的不需要再放进去了
            if(visited[i]) continue;
            //接下来,如果当前节点与他的前一个节点一样,并其他的前一个节点已经被遍历过了,那我们也就不需要了。
            if(i>0 && nums[i] == nums[i-1] && visited[i-1]) break;
            //做出选择
            trace.add(nums[i]);
            visited[i] = true;
            findUnique(nums,visited,trace);
            //撤销选择
            trace.removeLast();
            visited[i] = false;
        }
    }
}
原文地址:https://www.cnblogs.com/CodeSPA/p/13689330.html