47. 全排列II - LeetCode

47. 全排列II

题目链接

dfs

  • 在上一题的基础上,数字会重复,但排列不能重复
  • 所以我们需要先对数据排序,在每层递归选择数字时,不跟上一个重复即可
class Solution {
    List<List<Integer>> ans;

    public List<List<Integer>> permuteUnique(int[] nums) {
        Arrays.sort(nums);
        ans = new ArrayList<>();
        int len = nums.length;
        dfs(nums, new boolean[len], new ArrayList<Integer>());
        return ans;
    }

    private void dfs(int[] nums, boolean[] marked, List<Integer> now){
        int len = nums.length;
        if(now.size() == len){
            ans.add(new ArrayList<Integer>(now));
            return;
        }
        int last = 11;
        for(int i = 0; i < len; i++)
            if(!marked[i] && nums[i] != last){
                last = nums[i];
                marked[i] = true;
                now.add(nums[i]);
                dfs(nums, marked, now);
                marked[i] = false;
                now.remove(now.size() - 1);
            }
    }
}
posted @ 2021-03-04 14:42  一天到晚睡觉的鱼  阅读(40)  评论(0)    收藏  举报