90. 子集 II

90. 子集 II

  • 原题链接:
  • 完成情况:
  • 解题思路:
  • 参考代码:
  • 错误经验吸取

原题链接:

90. 子集 II

https://leetcode.cn/problems/subsets-ii/description/

完成情况:

在这里插入图片描述

解题思路:

/**
* 包含重复元素,但不包含重复解集。
*
* @param nums
* @return
*/
public List<List> subsetsWithDup(int[] nums) {
//输入:nums = [1,2,2]
//输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]
// TODO 方法一:永远记住有个暴力的Set去重
//作为单独元素回溯时,同一个元素不能出现两次

 if (i>startUsedIndex && nums[i-1] == nums[i]){continue;}

参考代码:

package 代码随想录.回溯;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class _90子集II {List<List<Integer>> result = new ArrayList<List<Integer>>();List<Integer> listSubsets = new ArrayList<Integer>();/*** 包含重复元素,但不包含重复解集。** @param nums* @return*/public List<List<Integer>> subsetsWithDup(int[] nums) {//输入:nums = [1,2,2]//输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]// TODO 方法一:永远记住有个暴力的Set去重//作为单独元素回溯时,同一个元素不能出现两次Arrays.sort(nums);backTrack(nums,0);  //想一下终止条件是啥?不像前面还有分隔逗号判断,这个只有长度判断return result;}/**** @param nums* @param startUsedIndex*/private void backTrack(int[] nums, int startUsedIndex) {//这道题空集也算,部分也算,所以直接添加result.add(new ArrayList<>(listSubsets));
//        if (startUsedIndex == nums.length - 1) {
//            return;
//        }//里面就得采取剪枝for (int i = startUsedIndex;i< nums.length;i++){// 跳过当前树层使用过的、相同的元素//如果这里不加判断则直接使用了if (i>startUsedIndex && nums[i-1] == nums[i]){continue;}listSubsets.add(nums[i]);backTrack(nums,i+1);listSubsets.remove(listSubsets.size()-1);}}
}

错误经验吸取