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

90. 子集 II(力扣LeetCode)

文章目录

  • 90. 子集 II
    • 题目描述
    • 回溯算法

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

回溯算法

class Solution {
public:// 主函数,接受一个整数数组作为输入,返回该数组所有可能的不重复子集vector<vector<int>> subsetsWithDup(vector<int>& nums) {sort(nums.begin(), nums.end());  // 先对数组进行排序,以便处理重复元素vector<bool> used(nums.size(), false);  // 记录每个元素是否被使用,避免重复子集backstracking(nums, 0, used);  // 开始回溯算法return result;  // 返回所有找到的子集}private:vector<vector<int>> result;  // 用于存储所有可能的子集vector<int> path;  // 用于存储当前路径(即当前构造的子集)// 回溯函数void backstracking(vector<int>& nums, int start, vector<bool> used) {result.push_back(path);  // 将当前路径添加到结果集// 遍历数组中的每个元素for (int i = start; i < nums.size(); i++) {// 如果当前元素和前一个元素相同,并且前一个元素没有被使用过// 则跳过当前元素,避免产生重复的子集if (i > 0 && nums[i] == nums[i - 1] && !used[i - 1]) {continue;}path.push_back(nums[i]);  // 将当前元素加入到路径used[i] = true;  // 标记当前元素为已使用backstracking(nums, i + 1, used);  // 递归调用,继续向路径添加元素path.pop_back();  // 回溯,移除路径中的当前元素used[i] = false;  // 取消当前元素的已使用标记}}
};

这段代码实现了一个基于回溯算法的解决方案来生成所有可能的子集,包括处理重复元素以避免重复子集的情况。首先,它通过排序输入数组nums来处理可能的重复元素。used数组用来跟踪每个元素的使用情况,确保在生成子集时不会因为重复元素而产生重复的子集。

backstracking方法内部,每次调用都会将当前path加入到结果集result中,然后通过一个循环遍历nums数组的剩余部分。如果当前元素与前一个元素相同并且前一个元素没被使用过,循环会跳过当前元素,通过这种方式来避免生成重复的子集。

每次递归调用backstracking都会向path中添加一个新元素,并且更新used数组来反映这个元素已经被使用过了。一旦完成了对当前元素的处理,代码会通过path.pop_back()used[i] = false来回溯,即移除当前元素并标记为未使用,以便于下次循环可以使用该元素的下一个元素。

http://www.lryc.cn/news/311125.html

相关文章:

  • 202435读书笔记|《半小时漫画中国史》——读点经济学与历史,生活更美好,趣味烧脑土地制度、商鞅变法、华丽丽的丝绸之路这里都有
  • 2023下半年主品牌锋芒依旧,江南布衣打破既定天花板?
  • Gitlab: PHP项目CI/CD实践
  • c语言游戏实战(10):坤坤的篮球回避秀
  • 初学arp欺骗
  • ftp几个常见错误问题及解决办法
  • 鸿蒙App开发新思路:小程序转App
  • C++17之std::invoke: 使用和原理探究(全)
  • shadertoy 游戏《来自星尘》摇杆复刻
  • 获取PDF中的布局信息——如何获取段落
  • Laya2.13.3在Web条件下使用键盘控制相机移动
  • centos系统服务器在Jenkins执行playwright UI自动化测试框架
  • boost.redis崩溃的解决方法
  • 蓝桥杯——123
  • 嵌入式基础知识-信号量,PV原语与前趋图
  • 代码遗产:探索祖传代码的历史、挑战与现代融合艺术
  • Vue3:用vite创建Vue3项目
  • STM32 (2)
  • docker部署nginx+反向代理配置/代理宿主机网段服务器
  • 初识Hive
  • Google发布Genie硬杠Sora:通过大量无监督视频训练最终生成可交互虚拟世界
  • 全球首台!未磁科技256通道无液氦脑磁图仪及芯片化原子磁力计正式发布
  • openssl3.2 - exp - 内存操作(建立,写入,读取)配置
  • 前端食堂技术周刊第 114 期:Interop 2024、TS 5.4 RC、2 月登陆浏览器的新功能、JSR、AI SDK 3.0
  • #QT(信号与槽)
  • go 设置滚动日志
  • Rollup入门学习:前端开发的构建利器
  • 游戏寻路之A*算法(GUI演示)
  • 软件工程顶会——ICSE '24 论文清单、摘要
  • Vue点击复制到剪切板