47. 全排列 II

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutations-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


注意这里一开始由于固定思维,想需要排序来处理重复问题。其实不用,缓存了每次交换的值,如果遇到重复的,就跳过了,所以不用排序。

    List<List<Integer>> ret = new ArrayList<>();
    public List<List<Integer>> permuteUnique(int[] nums) {
        // Arrays.sort(nums);

        dfs(nums,0);
        return ret;


    }


    public void dfs(int[] nums, int index) {
        if(index == nums.length) {
            List<Integer> list = new ArrayList<>();
            for(int i=0;i<nums.length;i++) {
                list.add(nums[i]);
            }
            ret.add(list);
            return;
        }
        // 用来保存用来交换过的值。如果碰到重复的就不再交换了
        List<Integer> visited = new ArrayList<>();
        for(int i=index;i<nums.length;i++) {
            if(visited.contains(nums[i])) {
                continue;
            }
            visited.add(nums[i]);
            swap(nums,index, i);
            dfs(nums,index+1);
            swap(nums,index, i);
        }


    }

    public void swap(int[] nums, int i, int j) {
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }

posted @ 2022-02-28 16:20  一颗青菜  阅读(3)  评论(0)    收藏  举报