子集II--(回溯+去重)

news2024/11/18 7:28:57

1题目

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。

示例 1:

输入:nums = [1,2,2]
输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]

示例 2:

输入:nums = [0]
输出:[[],[0]]

提示:

  • 1 <= nums.length <= 10
  • -10 <= nums[i] <= 10

2链接

题目链接:90. 子集 II - 力扣(LeetCode)

视频链接:回溯算法解决子集问题,如何去重?| LeetCode:90.子集II_哔哩哔哩_bilibili

3解题思路

这道题就是78.子集和40.组合总和II的结合体,但是一定要理解“树层去重”和“树枝去重”的区别

用示例中的[1, 2, 2] 来举例,如图所示: (注意去重需要先对集合排序

从图中可以看出,同一树层上重复取2 就要过滤掉,同一树枝上就可以重复取2,因为同一树枝上元素的集合才是唯一子集!

递归三部曲也不写了,没必要。要是自己想不起来了就去看前面的题解

记得是加了个used来判断是树枝去重还是树层去重。

我直接嘎嘎上代码

4代码

class Solution {
private:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking(vector<int>& nums, int startIndex, vector<bool>& used) {
        result.push_back(path);
        for (int i = startIndex; i < nums.size(); i++) {
            // used[i - 1] == true,说明同一树枝candidates[i - 1]使用过
            // used[i - 1] == false,说明同一树层candidates[i - 1]使用过
            // 而我们要对同一树层使用过的元素进行跳过
            if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) {
                continue;
            }
            path.push_back(nums[i]);
            used[i] = true;
            backtracking(nums, i + 1, used);
            used[i] = false;
            path.pop_back();
        }
    }

public:
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        result.clear();
        path.clear();
        vector<bool> used(nums.size(), false);
        sort(nums.begin(), nums.end()); // 去重需要排序
        backtracking(nums, 0, used);
        return result;
    }
};

下班淦饭

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/604462.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于最大似然反射率的异构激光雷达强度标定方案(开源)

文章&#xff1a;Maximum Likelihood Remission Calibration for Groups of Heterogeneous Laser Scanners 作者&#xff1a;Bastian Steder Michael Ruhnke Rainer Kummerle Wolfram Burgard 编辑&#xff1a;点云PCL 代码&#xff1a;https://github.com/soytony/IntensityCa…

vue 更新数组的方法

在 vue中&#xff0c;我们可以通过给数组添加索引来更新数组的值&#xff0c;比如我们需要在一个新的页面中添加一个新的元素&#xff0c;那么我们就可以通过给这个数组添加索引来实现。那么有朋友就会问了&#xff0c;为什么不直接在 vue中直接添加一个新的元素呢&#xff1f;…

chatgpt赋能python:Python列表排列顺序详解

Python列表排列顺序详解 作为一门功能丰富的高级编程语言&#xff0c;Python在不同类型的开发任务中广泛应用。其中&#xff0c;列表是一种常见的数据类型&#xff0c;用于存储多个元素。Python列表可以包含任何类型的数据&#xff0c;包括数字、字符串和其他列表等&#xff0…

干洗店软件,洗衣洗鞋线上下单小程序开发

干洗店软件洗衣洗鞋线上下单小程序&#xff1b; 可以实现客户自助办理&#xff0c;也可以和公众号、小程序等结合起来。干洗店软件可以实现客户管理&#xff0c;如积分管理&#xff0c;产品设置等功能。 线上下单&#xff0c;上门取货&#xff0c;订单拍照&#xff0c;订阅提示…

开发者实战 | 分割一切?Segment Anything 量化加速实战

点击蓝字 关注我们,让开发变得更有趣 作者 | 杨亦诚 排版 | 李擎 分割一切&#xff1f; Segment Anything 量化加速实战 前言 “分割一切,大家一起失业&#xff01;”——近期&#xff0c;这样一句话在社交媒体上大火&#xff01;这讲的就是 Segment Anything Model&#xff08…

chatgpt赋能python:Python创建一个Person类

Python 创建一个 Person 类 Python 是一种高级编程语言&#xff0c;因为它易于学习和使用&#xff0c;并且可以用于多种用途。使用 Python&#xff0c;您可以轻松创建各种程序&#xff0c;从简单的脚本到完整的应用程序。Python 的一个重要特点是它的面向对象编程能力&#xf…

「VS」Visual Studio 字符集

✨博客主页&#xff1a;何曾参静谧的博客 &#x1f4cc;文章专栏&#xff1a;「VS」Visual Studio 当我们在使用 Visual Studio 编写程序时&#xff0c;经常会遇到字符集的问题。在 Visual Studio 中&#xff0c;字符集选项有两个选项&#xff1a;Unicode 字符集和多字节字符集…

期刊和会议如何查询、期刊级别分类和顶会概念一文精析

期刊和会议查询、期刊级别分类和顶会概念分析 一、如何查询期刊和会议1.中文期刊-用知网出版物检索2.外文期刊-一般用letpub3.会议查询 二、国内期刊的正刊三、国内核心期刊四、国际核心期刊五、ESCI、SCI和SCIE的区别六、国际会议核心七、普刊八、顶刊九、水刊十、预警期刊 了…

一起看 I/O | Android 性能相关最新动态

作者 / Ben Weiss 过去几年来&#xff0c;我们一直致力于让性能提升工作变得更易上手、回报更高。我们将在本文中分享这一领域的最新发展动态。为您介绍基准配置文件、Android Studio 中的工具改进、库&#xff0c;以及我们如何让这项技术更好地在后台为您服务。此外&#xff0…

IPA50R190CE-ASEMI代理英飞凌MOS管IPA50R190CE

编辑&#xff1a;ll IPA50R190CE-ASEMI代理英飞凌MOS管IPA50R190CE 型号&#xff1a;IPA50R190CE 品牌&#xff1a;Infineon(英飞凌) 封装&#xff1a;TO-220F 最大漏源电流&#xff1a;24.8A 漏源击穿电压&#xff1a;500V RDS&#xff08;ON&#xff09;Max&#xff1…

某oa 11.10 未授权任意文件上传

漏洞简介 之前也对通达 oa 做过比较具体的分析和漏洞挖掘&#xff0c;前几天看到通达 oa 11.10 存在未授权任意文件上传漏洞&#xff0c;于是也打算对此进行复现和分析。 环境搭建 https://www.tongda2000.com/download/p2019.php 下载地址 &#xff1a;https://cdndown.tongda…

java-Lambde和方法引用

java-Lambde和方法引用 一、Lambda表达式 1.1 Lambda标准格式 格式&#xff1a; ​ (形参) -> {代码块} 形参&#xff1a;如果有多个参数&#xff0c;参数之间用逗号隔开&#xff1b;如果没有参数&#xff0c;留空即可 ->&#xff1a;由英文中画线和大于符号组成&#…

企业虚拟机服务器中了lockbit3.0勒索病毒怎么办,lockbit勒索病毒解密

虚拟机服务器在现代企业中扮演着至关重要的角色&#xff0c;它是一个重要的基础设施&#xff0c;用于支持大量的业务应用和数据存储。然而&#xff0c;随着网络攻击技术的不断发展&#xff0c;企业虚拟机服务器也面临着来自黑客的威胁。其中一种最具破坏性的攻击是勒索病毒&…

单例模式8种写法

0. 为什么需要单例模式&#xff1f; 节省内存和计算保证结果正确方便管理 使用场景&#xff1a; 1. 饿汉式&#xff08;静态常量&#xff09;—推荐指数&#xff1a;★★☆☆☆ 优点&#xff1a;不会有线程安全问题。 缺点&#xff1a;在类加载的时候就创建对象&#xff0c;…

VMware SD-WAN 5.2 发布 - 软件定义的 WAN

VMware SD-WAN 5.2 发布 - 软件定义的 WAN SD-WAN 解决方案的领导者 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-sd-wan-5/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 产品概述 软件定义的 WAN (SD-WAN)…

chatgpt赋能python:Python列表横向合并

Python列表横向合并 Python是一种功能强大的编程语言&#xff0c;被越来越多的开发者所青睐。列表是Python中最常用的数据结构之一&#xff0c;它是一种有序的集合&#xff0c;可以存储任意类型的数据。在编写Python程序时&#xff0c;很常见的需求是将两个或多个列表横向合并…

(超详细)关于Nacos的共享配置( shared-configs)和拓展配置(extension-config)

前言 用SpringBoot的铁子们&#xff0c;相信大多数人都使用过Nacos作为注册中心和配置文件管理中心&#xff0c;确实很方便。但是很多铁子们依葫芦画瓢&#xff0c;都知道怎么用&#xff0c;但是对于其中的细节可能没有系统地整理过。今天就讲讲关于Nacos的共享配置和扩展配置…

【C++11】C++11新增语法 Lambda表达式/Lambda的底层原理

Lambda表达式 1 Lambda使用的一个例子2 Lambda 表达式的语法3 初次体验Lambda表达式4 Lambda函数底层实现原理 1 Lambda使用的一个例子 在C98中&#xff0c;如果我们想要对一个自定义类型进行排序&#xff0c;就需要用户自定义去书写比较的规则。 #include <iostream> …

排序算法——直接插入排序

直接插入排序 基本思想 直接插入排序是一种简单明了的插入排序法&#xff0c;其基本思想是&#xff1a;把待排序的数据按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有数据插入完为止。 在现实生活中&#xff0c;我们玩扑克对牌进行排序就运用了…

开源、易扩展、方便集成的Web绘图工具(流程图、架构图、组态、SCADA、大屏)

乐吾乐2D可视化Meta2d.js是一个基于typescript canvas 实现的开源在线绘图软件。采用引擎 图形库中间件的思路能够方便、快速的扩展、集成到前端项目。 集实时数据展示、动态交互、数据管理等一体的全功能可视化平台。帮助物联网、工业互联网、电力能源、水利工程、智慧农业…