LeetCode ---- 90. 子集 II

题目链接

思路:

此题与78题的思路一致,不同的是,此题所给的数组中存在着重复元素,且题目要求不可以有重复的子集,那么我们在寻找子集的时候将重复的过滤掉即可。

78题思路见此

这里主要说一下过滤重复的操作

首先给数组进行排序,这样就会把所有重复元素聚集在一起

接下来,在每一个搜索的时候,如果数组中当前值和上一个值相同,那么此值需要跳过

    public List<List<Integer>> subsetsWithDup(int[] nums) {
        List<List<Integer>> ans = new ArrayList<>();
        if (nums == null || nums.length == 0) {
            ans.add(new ArrayList<>());
            return ans;
        }
        // 给数组进行排序
        Arrays.sort(nums);
        dfs(nums, 0, new ArrayDeque<>(), ans);
        return ans;
    }
    /**
     * 
     * @param nums  原始数组
     * @param start  从数组中第几个位置开始向后寻找
     * @param path   当前的子集
     * @param ans    最终的结果
     */
    private void dfs(int[] nums, int start, Deque<Integer> path, 
                                            List<List<Integer>> ans) {
        // 每一次进入时,将当前的子集添加进结果中
        ans.add(new ArrayList<>(path));
        for (int i = start; i < nums.length; i++) {
            // 过滤掉重复数字
            if (i > start && nums[i] == nums[i - 1]) {
                continue;
            }
            // 将当前数字添加进当前子集中
            path.addFirst(nums[i]);
            // 寻找下一个位置           
            dfs(nums, i + 1, path, ans);
            // 将当前数字从当前子集中除去
            path.pollFirst();
        }
    }

猜你喜欢

转载自blog.csdn.net/sinat_34679453/article/details/107215177