其他分享
首页 > 其他分享> > LeetCode 0047 Permutations II

LeetCode 0047 Permutations II

作者:互联网

原题传送门

1. 题目描述

2. Solution

1、思路分析
此题是「46. 全排列」的进阶,序列中包含了重复的数字,要求我们返回不重复的全排列,那么我们依然可以选择使用搜索回溯的方法来做。
只需要注意,要解决重复问题,我们只要设定一个规则,保证在填第i个数的时候重复数字只会被填入一次即可。而在本题解中,我们选择对原数组排序,保证相同的数字都相邻,然后每次填入的数一定是这个数所在重复数集合中「从左往右第一个未被填过的数字」,即如下的判断条件:

if (used[i] || i > 0 && nums[i] == nums[i - 1] && !used[i - 1]) continue;

2、代码实现

package Q0099.Q0047PermutationII;

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

public class Solution {
    public List<List<Integer>> permuteUnique(int[] nums) {
        List<List<Integer>> list = new ArrayList<>();
        Arrays.sort(nums);
        backtrack(list, new ArrayList<>(), nums, new boolean[nums.length]);
        return list;
    }

    /*
        DFS: Depth First Search, 深度优先搜索,从图中某个顶点v0出发,访问此顶点,然后依次从v0的未被访问的邻接点出发递归地进行同样的深度
        优先搜索,直至图中所有和v0有路径相通的顶点都被访问到。
     */
    private void backtrack(List<List<Integer>> list, ArrayList<Integer> curRes, int[] nums, boolean[] used) {
        if (curRes.size() == nums.length) {
            list.add(new ArrayList<>(curRes));
        } else {
            for (int i = 0; i < nums.length; i++) {
                if (used[i] || i > 0 && nums[i] == nums[i - 1] && !used[i - 1]) continue;
                used[i] = true;
                curRes.add(nums[i]);
                backtrack(list, curRes, nums, used);
                used[i] = false;
                curRes.remove(curRes.size() - 1);
            }
        }
    }
}

3、复杂度分析
image.png

标签:used,nums,ArrayList,Permutations,list,II,&&,curRes,LeetCode
来源: https://www.cnblogs.com/junstat/p/16070049.html