当前位置: 首页 > news >正文

算法leetcode|90. 子集 II(rust重拳出击)


文章目录

  • 90. 子集 II:
    • 样例 1:
    • 样例 2:
    • 提示:
  • 分析:
  • 题解:
    • rust:
    • go:
    • c++:
    • python:
    • java:


90. 子集 II:

给你一个整数数组 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

分析:

  • 面对这道算法题目,二当家的再次陷入了沉思。
  • 穷举数组的所有子集,每个数组元素都有被选择和不被选择两种情况,所以总的子集数量应该是 2n 个。
  • 数组中有重复元素,所以简单的按照选择不选择两种情况处理所有数组元素就会导致出现重复的子集,而题目是要求结果中不能包含重复子集的。
  • 简单的构建子集,然后判断子集是否已经在结果集中,当然是可行的,但是效率低下。
  • 先排序就可以用另一种方式去重,排序后相同的重复数组元素都会挨在一起,我们让选择某个数组元素值,变成计数,因为选其中任意一个都是相同的,同样选任意两个也是相同的,同理,相同元素选择任意多个,都与顺序位置无关,只与选择的个数有关。我们假定要求按照排序顺序选择,前面的选择了,后面的才有可能选择,这样就可以保证选择的数量不会重复,如果选择第二个,那么第一个一定也选择了,这也是选择两个的唯一方式,如果某个元素有三个,选择第三个时,必须前两个也都是选择的,不能选择任意位置的相同元素,这样就可以保证个数决定位置,从而达到去重的效果。
  • 另外,排序不是目的,只是为了方便去重,这种情况,二当家的认为用计数排序是最好的,尤其是元素种类提前知道,并且较少的情况。

题解:

rust:

impl Solution {pub fn subsets_with_dup(nums: Vec<i32>) -> Vec<Vec<i32>> {let mut ans = Vec::new();let mut nums = nums;// 排序nums.sort();let n = nums.len();// 每一个数都有选择和不选2种情况,穷举所有可能(0..(1 << n)).for_each(|mask| {let mut row = Vec::new();let mut flag = true;for i in 0..n {if (mask & (1 << i)) != 0 {if i > 0 && nums[i] == nums[i - 1] && (mask & (1 << (i - 1))) == 0 {// 配合排序去重(上一个数没选,这一个也不选,否则就和之前选择上一个的分支发生重复)flag = false;break;}row.push(nums[i]);}}if flag {ans.push(row);}});return ans;}
}

go:

func subsetsWithDup(nums []int) [][]int {var ans [][]int// 排序sort.Ints(nums)n := len(nums)outer:// 每一个数都有选择和不选2种情况,穷举所有可能for mask := 0; mask < (1 << n); mask++ {var row []intfor i, v := range nums {if mask&(1<<i) > 0 {// 配合排序去重(上一个数没选,这一个也不选,否则就和之前选择上一个的分支发生重复)if i > 0 && v == nums[i-1] && (mask&(1<<(i-1))) == 0 {continue outer}row = append(row, v)}}ans = append(ans, row)}return ans
}

c++:

class Solution {
public:vector<vector<int>> subsetsWithDup(vector<int>& nums) {vector<vector<int>> ans;// 排序sort(nums.begin(), nums.end());int n = nums.size();// 每一个数都有选择和不选2种情况,穷举所有可能for (int mask = 0; mask < (1 << n); ++mask) {vector<int> row;bool flag = true;for (int i = 0; i < n; ++i) {if (mask & (1 << i)) {// 配合排序去重(上一个数没选,这一个也不选,否则就和之前选择上一个的分支发生重复)if (i > 0 && nums[i] == nums[i - 1] && (mask & (1 << (i - 1))) == 0) {flag = false;break;}row.emplace_back(nums[i]);}}if (flag) {ans.emplace_back(row);}}return ans;}
};

python:

class Solution:def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:ans = []# 排序nums.sort()n = len(nums)# 每一个数都有选择和不选2种情况,穷举所有可能for mask in range(1 << n):flag = Truerow = []for i in range(n):if mask & (1 << i):# 配合排序去重(上一个数没选,这一个也不选,否则就和之前选择上一个的分支发生重复)if i > 0 and nums[i] == nums[i - 1] and (mask & (1 << (i - 1))) == 0:flag = Falsebreakrow.append(nums[i])if flag:ans.append(row)return ans

java:

class Solution {public List<List<Integer>> subsetsWithDup(int[] nums) {final List<List<Integer>> ans = new ArrayList<>();// 排序Arrays.sort(nums);final int n = nums.length;// 每一个数都有选择和不选2种情况,穷举所有可能for (int mask = 0; mask < (1 << n); ++mask) {final List<Integer> row  = new ArrayList<>();boolean             flag = true;for (int i = 0; i < n; ++i) {if ((mask & (1 << i)) != 0) {// 配合排序去重(上一个数没选,这一个也不选,否则就和之前选择上一个的分支发生重复)if (i > 0 && nums[i] == nums[i - 1] && (mask & (1 << (i - 1))) == 0) {flag = false;break;}row.add(nums[i]);}}if (flag) {ans.add(row);}}return ans;}
}

非常感谢你阅读本文~
欢迎【点赞】【收藏】【评论】三连走一波~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://le-yi.blog.csdn.net/ 博客原创~


相关文章:

算法leetcode|90. 子集 II(rust重拳出击)

文章目录 90. 子集 II&#xff1a;样例 1&#xff1a;样例 2&#xff1a;提示&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 90. 子集 II&#xff1a; 给你一个整数数组 nums &#xff0c;其…...

git 泄露

得到flag有两种方法&#xff1a; 1、版本比对&#xff1a;git diff 用法&#xff1a;git diff <分支名1> <分支名2> 2、版本回退&#xff1a;git reset 用法&#xff1a;git reset --hard <分支名> python2 GitHack.py http://www.example.com/.git/ g…...

Elasticsearch知识

目录 Elasticsearch逻辑设计和物理设计 逻辑设计物理设计Elasticsearch原理 倒排索引文档的分析过程保存文档搜索文档写数据的底层原理 数据刷新&#xff08;fresh&#xff09;事务日志的写入ES在大数据量下的性能优化 文件系统缓存优化数据预热文档&#xff08;Document&…...

极智芯 | 解读国产AI算力天数智芯产品矩阵

欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文分享一下 解读国产AI算力天数智芯产品矩阵。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码和资源下载,链接:https://t.zsxq.com/0aiNxERDq 天数智芯属于国产 GPGPU 阵…...

使用 OpenCV 发现圆角矩形的轮廓

OpenCV - 如何找到圆角矩形的矩形轮廓? 问题: 在图像中,我试图找到矩形对象的圆角轮廓。然而,我对两者的尝试 HoughLinesP 并 findContours 没有产生预期的结果。 我的目标是找到一个类似于以下形状的矩形: 。 代码: import cv2 import matplotlib.pyplot as plt…...

vscode项目推送到git

1、打开项目文件 打开文件后点击vs code左侧工具栏中第三个源代码管理图标&#xff0c;点击初始化仓库&#xff0c;此时会创建一个本地仓库会检查该项目中的文件变更 2、创建远程仓库 点击克隆/下载&#xff0c;复制HTTPS地址 3、添加远程地址 1&#xff09;图形化操作 2…...

COMP2121 Discrete Mathematics

COMP2121 Discrete Mathematics 需要可WeChat: zh6-86...

【随笔记录】VMware搭建python开发环境

Vmware虚拟机总是连接不到网络。 环境为&#xff1a;笔记本WLAN 解决方法。 1.直接使用VMware 编辑->虚拟网络编辑器->恢复默认设置。 2.取消网卡的IP的dhcp获取&#xff0c;改为static。网关为提供IP的主机的网络IP&#xff08;NAT模式&#xff09; 3.windows打开共享网…...

基于C++实现水仙花数

1、水仙花数的连营 1.1、水仙花数 在学习程序设计课程时&#xff0c;大多数读者一定采用循环结构编写过求解水仙花数的程序。 【实例 1-1】水仙花数 一个三位整数&#xff08;100&#xff5e;999&#xff09;&#xff0c;若各位数的立方和等于该数自身&#xff0c;则称其为“…...

关于一个类中引用两外一个类中的变量和方法,一个技巧可以提高开发效率

import static com.xx.xx.util.ext.xx.toJson; import static com.xx.xx.util.ext.smf.Cert.certMgrClient; 第一个引用一个方法&#xff0c;第二个引用一个变量&#xff0c; 引用后就可以直接通过变量名或者方法名就行使用&#xff0c;很方便&#xff0c;不要通过class.方式调…...

算法笔记:OPTICS 聚类

1 基本介绍 OPTICS(Ordering points to identify the clustering structure)是一基于密度的聚类算法 OPTICS算法是DBSCAN的改进版本 在DBCSAN算法中需要输入两个参数&#xff1a; ϵ 和 MinPts &#xff0c;选择不同的参数会导致最终聚类的结果千差万别&#xff0c;因此DBCSAN…...

SSRF漏洞防御:黑白名单的编写

文章目录 SSRF漏洞防御:黑白名单的编写黑名单的制作白名单的制作 SSRF漏洞防御:黑白名单的编写 以pikachu靶场中SSRF(crul)为例我们可以看到未做任何防御 我们查看源代码 黑名单的制作 思路: 什么内容不能访问 构造代码 $xyarray("file" > "",&q…...

想要对网站进行安全监测,安全SCDN效果怎么样?

随着互联网的迅速成长&#xff0c;各种网站出现的越来越多&#xff0c;个人网站、企业网站等&#xff0c;同时网站竞争也越来越强。随着用户对网站需求增多&#xff0c;对网站的安全也愈发受到人们的重视。那么我们日常网站运营中&#xff0c;有需要对网站进行安全监控&#xf…...

操作符extends的作用是什么?

在TypeScript中&#xff0c;extends关键字用于创建类之间的继承关系。它允许一个类&#xff08;子类&#xff09;继承另一个类&#xff08;父类&#xff09;的属性和方法&#xff0c;并可以在子类中添加新的属性和方法或者修改继承自父类的属性和方法。 extends的作用是实现类…...

跟着chatgpt一起学|1.spark入门之MLLib

chatgpt在这一章表现的不好&#xff0c;所以我主要用它来帮我翻译文章提炼信息 1.前言 首先找到spark官网里关于MLLib的链接 spark内一共有2种支持机器学习的包&#xff0c; 一种是spark.ml,基于DataFrame的&#xff0c;也是目前主流的 另一种则是spark.mllib,是基于RDD的…...

JAVA后端开发技术报告

JAVA后端开发技术报告 一、引言 随着互联网技术的不断发展&#xff0c;JAVA作为一门成熟的后端开发语言&#xff0c;应用范围广泛。本报告旨在介绍JAVA后端开发的相关技术&#xff0c;包括JAVA语言基础、Spring框架、数据库技术以及性能优化等方面&#xff0c;帮助开发者更好…...

销售心理学 如何了解客户的购买心理激发客户购买兴趣

销售心理学 如何了解客户的购买心理激发客户购买兴趣 在销售的世界里&#xff0c;掌握客户的购买心理&#xff0c;如同一把神奇的钥匙&#xff0c;能够解锁客户内心的需求和兴趣。如何巧妙地运用销售心理学&#xff0c;激发客户的购买欲望呢&#xff1f;以下是一些建议&#x…...

霍夫丁不等式(Hoeffding‘s inequality)

参考资料&#xff1a;Hoeffdings inequality | encyclopedia article by TheFreeDictionary 霍夫丁不等式&#xff08;Hoeffdings inequality&#xff09;描述了随机变量的和、与和的期望之差的上限&#xff1b;或者表述为&#xff1a;随机变量的均值、与均值的期望之差的上限。…...

【MATLAB源码-第90期】基于matlab的OQPSKsimulink仿真,对比初始信号和解调信号输出星座图。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 正交偏移二进制相移键控&#xff08;OQPSK, Orthogonal Quadrature Phase Shift Keying&#xff09;是一种数字调制技术&#xff0c;主要用于高效无线数据传输。它是传统二进制相移键控&#xff08;BPSK&#xff09;的一个变…...

自动驾驶芯片指标AI算力TOPS和CPU算力DMIPS

自动驾驶芯片指标AI算力TOPS和CPU算力DMIPS 文章目录 自动驾驶芯片指标AI算力TOPS和CPU算力DMIPS智能驾驶芯片CPU GPU NPU算力单位TOPS乘积累加运算MACTOPS计算公式GPU算力TFLOPSTFLOPS与TOPS的换算CPU算力DMIPS 智能驾驶芯片 根据地平线数据&#xff0c; L2级自动驾驶的算力…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...