No.90 子集II 

90. 子集 II - 力扣(LeetCode) (leetcode-cn.com)

 

思路:该题和 No.78类似,只是因为存在重复的值,在进行同一层遍历的时候,就不能够再使用相同的值。

          而在判断相同的值的时候,需要看两个值是否在同一层中。而判断方法就是 i>begin,begin是一层的开始,如果i>begin,那么此时i指向的就不会是一层之中的第一个值(画图的更好理解)

 public List<List<Integer>> subsetsWithDup(int[] nums) {
        List<List<Integer>> ans = new ArrayList<>();
        int len = nums.length;
        // 为了更好的处理重复值,需要先对数组进行排序
        Arrays.sort(nums);
        Deque<Integer> path = new ArrayDeque<>();
        ans.add(new ArrayList<>(path));  //先加一个空进去
        backTrack(len, 0, nums, ans, path);
        return ans;
    }
    public void backTrack(int len, int begin, int[] nums, List<List<Integer>> ans, Deque<Integer> path){
           for(int i=begin; i<len; i++){
              //判断同一层的相邻两个数是否相等
               if(i>begin && nums[i] == nums[i-1]){ 
                   continue;
               }
               path.addLast(nums[i]);
               ans.add(new ArrayList<>(path));
               backTrack(len, i+1, nums, ans, path);
               path.removeLast();
           }
    }

 

posted @ 2021-10-01 21:31  CharonKK  阅读(31)  评论(0)    收藏  举报