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去重

//作为单独元素回溯时,同一个元素不能出现两次

java 复制代码
 if (i>startUsedIndex && nums[i-1] == nums[i]){
	continue;
 }

参考代码:

java 复制代码
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);
        }
    }
}

错误经验吸取

相关推荐
武子康几秒前
Java-183 OSS 上传实战:Java 原生与 Spring Boot 集成
java·开发语言·spring boot·分布式·spring·阿里云·oss
know__ledge2 分钟前
吴恩达机器学习2022 -- Course1 -- Week3(分类问题)
人工智能·算法·目标检测·机器学习·分类
ALex_zry5 分钟前
Rust语言基础分析与C++对比:系统编程的现代演进
java·c++·rust
星释7 分钟前
Rust 练习册 105:从零开始实现链表数据结构
数据结构·链表·rust
会员果汁11 分钟前
优先级队列-C语言
c语言·数据结构·算法
你不是我我12 分钟前
【Java 开发日记】阻塞队列有哪些?拒绝策略有哪些?
java·开发语言
却话巴山夜雨时i14 分钟前
347. 前 K 个高频元素【中等】
数据结构·算法·leetcode
蘑菇小白14 分钟前
数据结构--栈
数据结构·算法·
(●—●)橘子……15 分钟前
力扣344.反转字符串 练习理解
python·学习·算法·leetcode·职场和发展
qq_4579242915 分钟前
[rdk系列之情绪识别算法上板运行]
算法