算法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/ 博客原创~


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

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

相关文章

Android查看当前机器的ABI类型

文章目录 使用 adb 命令&#xff1a;使用设备设置&#xff1a; 在 Android 设备上&#xff0c;可以通过执行以下步骤来查看当前机器的 ABI&#xff08;Application Binary Interface&#xff09;类型&#xff1a; 使用 adb 命令&#xff1a; 连接 Android 设备&#xff1a; 确保…

嵌入式基础知识学习:I2C通信协议

https://zhuanlan.zhihu.com/p/647656964 https://blog.csdn.net/FYBZ2020/article/details/128486981 I2C总线概述 I2C&#xff08;Inter-Integrated Circuit&#xff09;总线是两线式串行通信总线&#xff0c;是微电子通信控制领域广泛采用的一种总线标准。 在介绍I2C总线…

【转】ORB-SLAM2调用OAK-D双目摄像头进行点云建图

编辑&#xff1a;OAK中国 首发&#xff1a;A. hyhCSDN 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容来自用户的分享&#xff0c;如有疑问请与原作者交流&#xff01; ▌前言 Hello&#xff0c;大家好&#xff0c;这里是OAK中国&#xff0c;我是助手君。 近期在CSDN刷…

马斯克发布一封指控 Sam Altman 的匿名信引发猜测,OpenAI “宫斗大戏”终迎结局?

就在昨晚&#xff0c;持续了数日的 OpenAI 宫斗大戏&#xff0c;似乎终于要大结局了——OpenAI 官宣&#xff1a;Sam Altman 将回归 OpenAI&#xff0c;重新担任 CEO&#xff01; “我们已达成原则性协议&#xff0c;Sam Altman 将重返 OpenAI 担任 CEO&#xff0c;新的初始董…

OpenGL的学习之路 -5

1.视景体 正交投影 人眼看世界&#xff0c;有一个可见范围。范围内可见&#xff0c;范围外不可见。视景体就是这么一个概念。 &#xff08;上图仅学习记录用&#xff09; 在OGL中&#xff0c;有两种投影方式&#xff0c;对应两种视景体。第一种&#xff0c;正交投影&#xf…

Linux进程状态(僵尸进程,孤儿进程)+进程优先级+进程调度与切换

Linux进程状态[僵尸进程,孤儿进程]进程优先级 一.进程状态1.进程排队2.教材上对于进程状态的描述:1.阻塞挂起 3.Linux下具体的进程状态:1.Linux下的进程状态数组2.R3.S:可终止睡眠---浅度睡眠1.补充:前台进程和后台进程2.一种"奇怪"的现象 4.D:不可终止睡眠---深度睡…

探索人类命运与宇宙奥秘的震撼之旅 豆瓣高分巨作《三体》湖北卫视开播

当思考触及宇宙的边缘&#xff0c;当人类命运与外星文明相碰撞&#xff0c;电视剧《三体》以其深邃的内涵和引人深思的故事&#xff0c;重新审视人类的过去、现在和未来&#xff0c;带我们逐步揭开地外未知文明“三体”世界的神秘面纱。根据著名科幻作家刘慈欣同名小说改编&…

Ubuntu新手使用教程

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Django之ORM

ORM全称对象关系映射 作用&#xff1a;通过python面向对象的代码简单快捷的操作数据库&#xff0c;但是封装程度太高&#xff0c;有时候sql语句的效率偏低&#xff0c;需要自己写sql语句 类----->表 对象--->记录 对象属性--->记录某个字段对应的值 写在models.p…

深度解析:用Python爬虫逆向破解某查查加密数据!

大家好!我是爱摸鱼的小鸿,关注我,收看编程干货。 本期文章将带你详细地逆向解析某查查加密数据的构造逻辑,Follow me~ 特别声明:本篇文章仅供学习与研究使用,不用做任何非法用途,请大家遵守相关法律法规 作者:Maker陈,本文字数:1.2k,阅读时长≈2分钟 目录 一、逆向目…

如何通过内网穿透实现远程访问Linux SVN服务

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

骑行三家村赏红杉之旅:挑战与汗水共存,美景和惊喜同行的路线

2023年11月25日&#xff0c;一个冬日里阳光明媚的周末&#xff0c;校长骑行队的骑友们相约&#xff0c;共同踏上了骑行三家村赏红杉林的旅程。这次骑行路线从大观公园门口开始&#xff0c;途径大观湿地公园、干勾尾、碧鸡关加油站、太平、水沟盖板路、明朗、绝望坡、山顶、三家…

kali安装内网穿透工具并实现ssh远程连接

文章目录 1. 启动kali ssh 服务2. kali 安装cpolar 内网穿透3. 配置kali ssh公网地址4. 远程连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 简单几步通过[cpolar 内网穿透](cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站)软件实现ssh远程连接kali 1…

自动化立体仓库PLC控制系统手动运行功能

IF NOT "模式手动I" THEN "堆垛机过程数据块".手动模式封锁 : 0; "堆垛机过程数据块".手动点动保持显示 : 0; RETURN; END_IF; IF NOT "堆垛机过程数据块".手动模式封锁 THEN "FC41 系统总清占位"(); …

成都优优聚美团代运营——让您脱颖而出!

随着互联网的快速发展&#xff0c;越来越多的企业开始注重线上业务的拓展&#xff0c;而美团作为国内领先的生活服务平台之一&#xff0c;自然成为了许多品牌宣传和推广的重要渠道。在成都地区&#xff0c;优优聚美团代运营公司凭借多年的经验和专业团队的优势&#xff0c;成为…

单调栈:LeetCode 907. 子数组的最小值之和

907. 子数组的最小值之和 给定一个整数数组 arr&#xff0c;找到 min(b) 的总和&#xff0c;其中 b 的范围为 arr 的每个&#xff08;连续&#xff09;子数组。 由于答案可能很大&#xff0c;因此 返回答案模 10^9 7 。 思路同乘法原理 LeetCode 828. 统计子串中的唯一字符-…

护眼灯有效果吗?对孩子眼睛好的护眼台灯推荐

2022年12月29日&#xff0c;内蒙古消费者协会发布的比较试验结果显示&#xff0c;被检测的35款读写作业台灯样品中有12款标记项目不符合国家强制性标准要求&#xff0c;占被检测样品的34%&#xff0c;其中博士有成、大力智能、霍尼韦尔位列质量黑榜。该从哪些方面注意权衡做好选…

如何用CHAT配置linux的远程连接?

问CHAT&#xff1a;配置linux的远程连接 1.下载ssh 2.启动ssh服务 3.查看ssh服务状态 4.设置ssh服务开机自启动 5.设置windows的cmd下ssh 6.通过cmd的ssh命令远程到linux linux的ip:10.8.9.23 用户名:Li CHAT回复&#xff1a;以下是为配置Linux的远程连接的步骤说明&#xff1a…

AMD ROCm软件栈组件介绍

AMD ROCm™ Platform 1.1 ROCm简介 参考&#xff1a;https://github.com/RadeonOpenCompute/ROCm ROCm&#xff08;Radeon Open Compute&#xff09;开源软件栈。 在NVIDIA GPU上&#xff0c;术语“CUDA”通常是指GPU编程编译器、API和运行时库&#xff0c;但ROCm不那么单一…

Qt QTimer

目录 public/slot function signals static public function 使用 public/slot function // 构造函数 // 如果指定了父对象, 创建的堆内存可以自动析构 QTimer::QTimer(QObject *parent nullptr);// 设置定时器时间间隔为 msec 毫秒 // 默认值是0&#xff0c;一旦窗口系统…