LeetCode78.子集

news2024/11/18 20:18:46

 这道题如果用暴力法几乎是不可能解出来的,因为情况太复杂了,但是一旦用上递归回溯就会轻松很多,先上代码:

class Solution {
     List<List<Integer>> result = new ArrayList<List<Integer>>();
     List<Integer> list = new ArrayList<Integer>();
    public List<List<Integer>> subsets(int[] nums) {
        dfs(0,nums);
        return result;
    }
    public void dfs(int cur, int[] nums){
      if(cur == nums.length){
          result.add(new ArrayList<Integer>(list));
          return;
      }
      list.add(nums[cur]);
      dfs(cur+1, nums);
      list.remove(list.size()-1);
      dfs(cur+1, nums);
    }
}

对于数组中每个元素,其无非就两种状态,加入这个数组或者不加入这个数组,所以我们创建一个递归方法dfs(int cur, int[] nums),cur就是我们当前处理的这个元素的下标。

if(cur == nums.length){
          result.add(new ArrayList<Integer>(list));
          return;
      }

如果这个下标等于数组长度,说明数组中的所有元素都判断过了,可以把这个数组放进答案里了,但是我们不能把list放进去,因为这个list是全局的,dfs方法都在动这个list,后面的dfs会修改list,如果是放list,那么result里面就是全部一样的list并且是最后改完的list也就是空的list,因为最后一个递归是所有元素都是不添加的情况。所以这里用的是result.add(new ArrayList<Integer>(list));把list的副本添加进了result,这个副本不是指向list而是一个新的对象通过这个new也可以看出。

添加nums[cur]的情况:

list.add(nums[cur]);
dfs(cur+1, nums);

不添加nums[cur]的情况:

 list.remove(list.size()-1);
 dfs(cur+1, nums);

nums[cur]的情况判断完了,后面dfs(cur+1,nums)判断nums[cur+1]的情况。

还有一种方法是迭代法

class Solution {
     List<List<Integer>> result = new ArrayList<List<Integer>>();
     List<Integer> list = new ArrayList<Integer>();
    public List<List<Integer>> subsets(int[] nums) {
        int n = nums.length;
        for(int mask =0;mask < Math.pow(2,n);++mask){
            list.clear();
            for(int i = 0;i<n;i++){
                if((mask & (1 << i)) != 0){
                    list.add(nums[i]);
                }
            }
            result.add(new ArrayList<Integer>(list));
        }
        return result;
    }
}

就用对于数组中的任一元素用0,1表示它的状态,0表示不在数组中,1表示在数组中。假设数组长度为n,那么每一个n位的的01序列都表示一种情况,一共有2的n次方个序列,分别是0到2的n次方减1,那么我们只需要每一种情况都用一个list放数据就好了,对于每一个list我们需要遍历这n位,如果第i位是1就把nums[i]放进list,0则不放。

那么如何判断第i位是0还是1呢?只需要和一个第i位是1其他位是0的数按位与即可。

比如,10101 & 00100,就是00100,10001 & 00100,就是00000,它是把每一位的分别进行与,与的结果作为最终结果的第i位。所以用1左移i位就会得到一个只有第i位是1其他位是0的数,我们那么与的结果就取决于mask的第i位,如果第i位是0,那么每一位与的结果都是0,最终结果是0;如果第i位是1与的结果就是第i位是1其他位是0的数,这样就可以判断第i位是0还是1了。

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

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

相关文章

服务器连接github

https://zhuanlan.zhihu.com/p/543490354 比着这个一步步做就行。 https://blog.l0v0.com/posts/94ffdbdf.html 上传文件可以看这个 注意&#xff1a; 密钥ssh-keygen设置好之后&#xff0c;以后就不用每次输入账号密码才能访问了。 otherwise&#xff0c;每次要输入账号密码。…

ENVI中给影像添加坐标系

目录 待匹配影像坐标系信息参考影像坐标信息通过参考影像匹配坐标系 当我们在ENVi中打开影像发现缺失坐标系的时候&#xff0c;可以非常方便地通过参考影像来对其进行坐标系的匹配。 待匹配影像坐标系信息 首先我们双击想要加坐标系的影像查看Metedata&#xff0c;发现此时影像…

打破障碍:2024年赋能企业人工智慧生成创新-5个应用场景与6个转型步骤

想要了解如何采用生成式AI来提高企业效率和竞争力&#xff1f;本指南将介绍如何采用生成式AI来实现数字化转型&#xff0c;并打造智能化商业模式。从5大应用场景和6大步骤切入&#xff0c;让您了解如何开启生成式AI创新。立即连线创新专家咨询或观看创新战略方案视频进一步了解…

每日一题(LeetCode)----链表--链表中的下一个更大节点

每日一题(LeetCode)----链表–链表中的下一个更大节点 1.题目&#xff08;1019. 链表中的下一个更大节点&#xff09; 给定一个长度为 n 的链表 head 对于列表中的每个节点&#xff0c;查找下一个 更大节点 的值。也就是说&#xff0c;对于每个节点&#xff0c;找到它旁边的第…

蓝桥杯每日一题2023.11.25

题目描述 “蓝桥杯”练习系统 (lanqiao.cn) 题目分析 对于此题目最开始是递归想法&#xff0c;但发现题意中的匹配次数实际上是指在这8个字母中这8个字母每个字母对应的个数是否相同&#xff0c;如果相同则匹配。 此处我们可以使用subsrtr函数&#xff0c;每次循环截取8个字…

死锁是什么?死锁是如何产生的?如何破除死锁?

1. 死锁是什么 多个线程同时被阻塞&#xff0c;它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞&#xff0c;因此程序不可能正常终止。 2. 死锁的三种典型情况 一个线程, 一把锁, 是不可重入锁, 该线程针对这个锁连续加锁两次, 就会出现死锁. 两个线程…

图的邻接矩阵,邻接表的C语言实现(408真题)

图的邻接矩阵 数据结构定义 #define MAXV 50;//顶点数目的最大值 typedef struct{int vex[MAX]; //顶点表 int edge[MAXV][MAXV]; //邻接矩阵 int edgeNum,vexNum; //图中实际的边数和顶点数 }MGraph;初始化 void Matrix_Init(MGraph *Mgraph) {int v1, v2;//存储有边的…

【Linux】指令详解(三)

目录 1. 前言2. 常见指令2.1 重定向2.1.1 >2.1.2 >>2.1.3 < 2.2 与文件有关指令2.2.1 more2.2.2 less &#xff08;推荐使用&#xff09;2.2.3 head2.2.4 tail2.2.5 wc2.2.6 | 2.3 find2.4 grep 3. 时间相关的指令3.1 data3.2 时间戳3.3 cal 4. zip/unzip 1. 前言 …

JVM——垃圾回收(方法区中的垃圾回收和(堆回收)自动垃圾回收)

目录 1.自动垃圾回收介绍1.C/C的内存管理2.Java的内存管理3.垃圾回收的对比 2.方法区的回收方法区的回收 – 手动触发回收 3.堆回收1.引用计数法2.可达性分析算法 1.自动垃圾回收介绍 1.C/C的内存管理 ⚫ 在C/C这类没有自动垃圾回收机制的语言中&#xff0c;一个对象如果不再…

2017年8月3日 Go生态洞察:贡献者峰会探秘

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

智能化学习打破资源障碍 成为英语学习新趋势

智能化学习是一种基于互联网和人工智能技术的学习行为,通过网络,学习者可以随时随地进行学习,真正打破了时间和空间的限制。与传统线下学习方式相比,智能化学习更加方便、资源更加丰富,使海量英语学习资源唾手可得,智能化学习正逐渐成为中国孩子习得英语的重要方式。 随着全球…

代码随想录算法训练营第四十五天|57. 爬楼梯、322.零钱兑换、279. 完全平方数

KamaCoder 57. 爬楼梯 题目链接&#xff1a;题目页面 (kamacoder.com) 这道题使用完全背包来实现&#xff0c;我们首先考虑的是总的楼梯数&#xff0c;因此dp数组大小为n 1 &#xff0c;其意义是&#xff0c;在n阶时有多少种方法爬到楼顶&#xff0c;因此&#xff0c;当前n状…

MVCC多版本并发控制相关面试题整理

多版本并发控制是一种用于支持并发事务的数据库管理系统技术&#xff0c;它允许多个事务同时访问数据库&#xff0c;而不会相互干扰或导致数据不一致。MVCC通过在数据库中维护不同版本的数据来实现这一目标&#xff0c;从而允许每个事务看到一致的数据库快照。 并发导致的问题…

基于51单片机的人体追踪可控的电风扇系统

**单片机设计介绍&#xff0c; 基于51单片机超声波测距汽车避障系统 文章目录 一 概要概述硬件组成工作原理优势应用场景总结 二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 # 基于51单片机的人体追踪可控的电风扇系统介绍 概述 该系统是基于51…

王者农药小游戏

游戏运行如下&#xff1a; sxt Background package sxt;import java.awt.*; //背景类 public class Background extends GameObject{public Background(GameFrame gameFrame) {super(gameFrame);}Image bg Toolkit.getDefaultToolkit().getImage("C:\\Users\\24465\\D…

【教学类-06-09】20231125 (55格版)X-Y之间“加法减法+-题” (以10-20之间为例)(加法的正序+逆序,减法的正序,题目多)

图片展示 需求&#xff1a; 20以内加法减法&#xff0c;不需要再练习其中10以内部分&#xff0c;改为10-20以内的加法减法&#xff0c;X-Y大于10&#xff0c;小于20的所有加法减法题。 代码展示&#xff1a; X-Y 之间的所有加减混合法题&#xff08;如10-20之间的所有加法减法…

Proteus仿真--基于DS1302与1602LCD设计的可调式电子日历与时钟

本文介绍基于51单片机的DS1302与1602LCD可调式电子日历与时钟&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 本设计中时间芯片选用DS1302芯片&#xff0c;液晶选用LCD1602模块&#xff0c;按键K1-K4&#xff0c;K1用于年月日时分选择&#xff0c;K2用于…

前端入门(三)Vue生命周期、组件技术、脚手架、存储、事件总线、

文章目录 Vue生命周期Vue 组件化编程 - .vue文件非单文件组件组件的注意点组件嵌套Vue实例对象和VueComponent实例对象Js对象原型与原型链Vue与VueComponent的重要内置关系 应用单文件组件构建 Vue脚手架 - vue.cli项目文件结构组件相关高级属性引用名 - ref数据接入 - props混…

【数据结构实验】排序(三)快速排序算法的改进(三者取中法)

文章目录 1. 引言2. 快速排序算法2.1 传统快速排序2.2 三者取中法 3. 实验内容3.1 实验题目&#xff08;一&#xff09;输入要求&#xff08;二&#xff09;输出要求 3.2 算法实现 4. 实验结果 1. 引言 快速排序是一种经典的排序算法&#xff0c;其核心思想是通过选择一个基准元…

从0到0.01入门 Webpack| 003.精选 Webpack面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…