打印数组的所有子集

news/2024/5/16 11:55:25/文章来源:https://blog.csdn.net/hotonyhui/article/details/127143950

打印数组的所有子集

作者:Grey

原文地址:

博客园:打印数组的所有子集

CSDN:打印数组的所有子集

无重复值情况

题目描述见: LeetCode 78. Subsets

主要思路

定义递归函数

void p(int[] arr, int i, LinkedList<Integer> pre, List<List<Integer>> result)

递归含义是:数组arri往后开始收集所有的子集,i之前生成的子集是pre,所有生成的子集都存在result中,

base case 就是,当i来到arr.length位置的时候,此时,已经没有选的字符了,将收集到的pre加入result中,

针对普遍情况,可能性有两种,第一种,不要选择i位置的元素,那么接下来直接调用p(arr, i + 1, pre, result)

第二种情况,选择i位置的元素,则将i位置的元素加入pre的下一个位置中,即:pre.addLast(arr[i]),然后去下一个位置做决策,即p(arr, i + 1, pre, result)

第二种情况中,不要忘记选择了i位置的元素,在后续决策完毕后,需要恢复现场,即pre.removeLast()

完整代码见

class Solution {public static List<List<Integer>> subsets(int[] nums) {List<List<Integer>> result = new ArrayList<>();p(nums, 0, new LinkedList<>(), result);return result;}// i往后收集所有的子集public static void p(int[] arr, int i, LinkedList<Integer> pre, List<List<Integer>> result) {if (i == arr.length) {List<Integer> ans = new ArrayList<>(pre);result.add(ans);} else {// 不要i位置p(arr, i + 1, pre, result);pre.addLast(arr[i]);// 要i位置p(arr, i + 1, pre, result);// 恢复现场pre.removeLast();}}
}

有重复值情况

题目描述见: LeetCode 90. Subsets II

上一个问题由于题目限定了,没有重复元素,所以处理相对简单一些,本题说明了输入参数中可能会有重复的元素,且生成的子集不能有重复,此时有两个思路:

第一个思路,基于上一个问题的结果,即result,做去重操作,思路比较简单,但是复杂度会相对高一些,因为我们每次都要全量得到所有的子集,然后最后才去重。

第二个思路,在执行递归函数的时候,可以做一些剪枝,无须到最后再来去重,直接在递归函数中就把结果生成出来。接下来讲第二个解法的思路。

由于题目中已经说明,返回子集的顺序无要求,那么,我们可以首先将数组进行排序,排序后,所有相同的元素一定会排列到一起,然后定义一个和上一题一样的递归函数

void p(int[] nums, int i, LinkedList<Integer> pre, List<List<Integer>> result)

递归含义是:数组arri往后开始收集所有的无重复子集,i之前生成的子集是pre,所有生成的子集都存在result中。

接下来分析递归函数的可能性,我们可以不要选择i位置的元素,那么则可以直接加入result.add(new ArrayList<>(pre)),按上一题逻辑,接下来我们应该去i+1位置收集结果,但是,由于有重复元素,所以接下来ii+1,……i + n 都有可能是同一个元素,示例图如下

image

如上图,i一直到i+n都是元素a,直到i+n+1才是一个不同的元素,所以,当我们收集了i位置的元素以后,我们不能直接去i+1位置收集,而是应该从i+n+1位置开始收集。

完整代码见

class Solution {public static List<List<Integer>> subsetsWithDup(int[] nums) {List<List<Integer>> lists = new ArrayList<>();Arrays.sort(nums);p(nums, 0, new LinkedList<>(), lists);return lists;}public static void p(int[] nums, int i, LinkedList<Integer> pre, List<List<Integer>> result) {result.add(new ArrayList<>(pre));for (int s = i; s < nums.length; s++) {// 一直到下一个不等于s位置元素的地方if (s > i && nums[s] == nums[s - 1]) {continue;}pre.add(nums[s]);p(nums, s + 1, pre, result);pre.remove(pre.size() - 1);}}
}

更多

算法和数据结构笔记

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

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

相关文章

【数据结构与算法】深度理解队列(上)

✨hello&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f68e;&#x1f68e;系列专栏&#xff1a;【数据结构与算法】 &#x1f680;&#x1f680;本篇内容:队列从0到1的学习&#xff01; ⛵⛵作者简介&#xff1a;一名双非本科大三在读的科班Java编程小…

11-二叉树-删除

delete(ElementType e)&#xff1a;删除某个值为 e 的结点。实现方法有多种。 按添加结点的规则&#xff0c;小于根结点的放在左边&#xff0c;大于等于根结点的放在右边。b 小于 c 中任意一个子结点&#xff0c;只能放在 c 中最小的一个结点 e 的左子结点下。 除 e 外&#x…

Git基础操作

拉取代码直接clone,复制远程仓库文件夹 git clone git@gitee.com:chen-LinQiang/my-notes.git 在已有仓库文件夹中拉代码 # 初始化 git init # 关联远程仓库 git remote add origin git@gitee.com:chen-LinQiang/my-notes.git # 切换到本地主分支 git checkout master # 若报错…

SpringBoot员工管理的项目——SpringBoot首页定制的操作和国际编码操作(课时十五)

SpringBoot员工管理的项目——SpringBoot后台数据库的搭建(课时十四)_星辰镜的博客-CSDN博客 上篇文章的的文章路径 读者可以回看 有些内容在这里不在说明 本博文完成的两个功能: 利用 Thymeleaf模板引擎完成员工管理系统的的首页定制 国际化编码格式操作 <!--Thymeleaf 说…

计算机网络——媒体接入控制

&#x1f49f;&#x1f49f;前言 ​ 友友们大家好&#xff0c;我是你们的小王同学&#x1f617;&#x1f617; 今天给大家打来的是 计算机网络——媒体接入控制 希望能给大家带来有用的知识 觉得小王写的不错的话麻烦动动小手 点赞&#x1f44d; 收藏⭐ 评论&#x1f4c4; 小王…

20、DQL(编写顺序和执行顺序)

CSDN话题挑战赛第2期 参赛话题&#xff1a;学习笔记 DQL&#xff08;编写顺序和执行顺序&#xff09; 执行顺序&#xff1a; 1、from&#xff08;from 查什么表是第一&#xff09; 2、where 3、group by 和 having 4、select 5、order by&#xff08;你很与众不同哈&…

Promise 及其基于 Typescript 的实现

Promise 的概念、用法与实现作者&#xff1a; jcLee95 邮箱 &#xff1a;291148484163.com CSDN 主页&#xff1a;https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/121506948 相关文章&…

APP攻防

信息收集 APP-外在抓包-Fd&茶杯&BurpAPP-外在封包-封包监听工具APP-内在提取-AppInfoScannerAPP-内在搜索-反编译载入IDEAAPP-资源提取-安装包&资源文件APP-框架使用-Xposed&JustTrustMe fiddler 1、安装证书 然后设置-WLAN-高级设置-安装证书-安装FidderRo…

【C语言】字符+字符串函数精讲

前言 ● 从我们第一个C程序——Hello world 的诞生&#xff0c;到字符串的拷贝、比较等各种操作的实现。从中不难发现&#xff1a;我们在处理C语言时对字符和字符串的处理很是频繁&#xff0c;因此学习字符及字符串的各种操作函数尤显其必要性。 ● C语言本身是没有字符串类型的…

SpringBoot项目中计量单位与进制转换问题解决措施及数据校验怎么操作

写在前面&#xff1a; 继续记录自己的SpringBoot学习之旅&#xff0c;这次是SpringBoot应用相关知识学习记录。若看不懂则建议先看前几篇博客&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 3.2 配置高级 3.2.1 ConfigurationProperties注解 …

【小程序从0到1】小程序条件渲染|列表渲染

欢迎来到我的博客 &#x1f4d4;博主是一名大学在读本科生&#xff0c;主要学习方向是前端。 &#x1f36d;目前已经更新了【Vue】、【React–从基础到实战】、【TypeScript】等等系列专栏 &#x1f6e0;目前正在学习的是&#x1f525;React/小程序React/小程序React/小程序&am…

【mysql】performance_schema初识

1、linux下一些mysql常用的命令 打开mysqld服务 systemctl start mysqld关闭mysqld服务 systemctl stop mysqld查看 mysqld状态 service mysqld status修改MySQL的配置文件 vim /etc/my.cnf2、什么是performance_schema performance_schema是运行在较低级别的用于监控mys…

最小 XOR leetcode第 313 场周赛 第三题

给你两个正整数 num1 和 num2 &#xff0c;找出满足下述条件的整数 x &#xff1a; x 的置位数和 num2 相同&#xff0c;且 x XOR num1 的值 最小 注意 XOR 是按位异或运算。 返回整数 x 。题目保证&#xff0c;对于生成的测试用例&#xff0c; x 是 唯一确定 的。 整数…

用同一个GroovyClassLoader加载的Class真的无法回收吗

源码地址&#xff1a;https://gitee.com/mr_wenpan/basis-enhance/tree/master/enhance-boot-groovy-engine 一、问题描述 最近需要使用到groovy&#xff0c;于是进行了一番调研&#xff0c;看到网上有个很常见的说法&#xff0c;如下&#xff1a; 如果一个项目里使用同一个G…

matlab与python编程对照

格式 n. 功能 Matlab编程 Matlab输出 Python编程 Python输出 ——————————————————————————————————— 1. for 循环 Matlab编程 for i 1:3i end Matlab输出 Python编程 for i in range (1,4):print(i) Python输出 —————…

LSS-lift splat shoot论文与代码解读

目录序言论文代码总结序言 最近开始学习多摄融合领域了&#xff0c;定义是输入为多个摄像机图像&#xff0c;获得多个视角的相机图像特征&#xff0c;通过相机内外参数进行特征映射到BEV视角&#xff0c;得到360的视觉感知结果&#xff0c;今天分享的是经典论文LSS。 论文 论…

python算法面试题(一)

1、给定一个包含红色、白色和蓝色、共n 个元素的数组nums&#xff0c;原地对它们进行排序&#xff0c;使得相同颜色的元素相邻&#xff0c;并按照红色、白色、蓝色顺序排列。 我们使用整数 0、1 和 2 分别表示红色、白色和蓝色&#xff1b;必须在不使用库的sort函数的情况下解决…

二十五、C预处理器

文章目录一、定义1.1 C预处理器1.2 预定义宏1.3 预处理器运算符1.3.1 宏延续运算符 \1.3.2 字符串常量化运算符 (#)1.3.3 标记粘贴运算符 (##)1.4 参数化的宏一、定义 1.1 C预处理器 预处理器必须以#开头&#xff0c;其本质上是一个文本替换工具&#xff0c;有如下指令&#…

c++从入门到精通——命名空间与作用域

1 C概述 C两大编程思想 面向对象泛型编程 1.2 移植性和标准 ANSI 在1998制定出C第一套标准 2 c初识 引入头文件 #include 标准输入输出流 使用标准命名空间 using namespace std;标准输出流对象 cout << “…” << 1234 << 3.14 << endl; #inc…

03 NLP-神经网络基础常识复习1-损失函数,导数和梯度,链式法则

不进行神经网络的学习&#xff0c;就做不到“好的推理”。因此&#xff0c;常规的流程是&#xff0c;首先进行学习&#xff0c;然后再利用学习好的参数进行推理。所谓推理&#xff0c;就是对上一节介绍的多类别分类等问题给出回答的任务。而神经网络的学习的任务是寻找最优参数…