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(); } }

浙公网安备 33010602011771号