力扣---子集---回溯(子集型回溯)---递归

news2024/9/24 15:25:33

 递归法思路:

首先考虑为什么能用递归(因为存在大问题和小问题之间的关系,大问题:从第 i 个数字到最后一个数字之间找子集,小问题:从第 i+1 个数字到最后一个数字之间找子集)。其次,用递归的三段式:写边界条件(i==n+1,也就是所有的数都被判断完毕),考虑第 i 个数,不考虑第 i 个数。

代码:

C++:

class Solution {
public:
    void insert(vector<vector<int>>& res,vector<int>& visit,int len,vector<int>& nums){
        vector<int> temp;
        for(int i=0;i<len;i++){
            if(visit[i]){
                temp.push_back(nums[i]);
            }
        }
        res.push_back(temp);
    }

    void dfs(int i,vector<vector<int>>& res,vector<int>& visit,int len,vector<int>& nums){
        
        //边界条件
        if(i==len){
            insert(res,visit,len,nums);
            return;
        }
        
        //选择当前数字
        visit[i]=1;
        dfs(i+1,res,visit,len,nums);
        visit[i]=0;

        //不选择当前数字
        dfs(i+1,res,visit,len,nums);
    }

    vector<vector<int>> subsets(vector<int>& nums) {
        int len=nums.size();
        vector<int> visit(len,0);
        vector<vector<int>> res;
        dfs(0,res,visit,len,nums);
        return res;
    }
};

Python:

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        len_nums=len(nums)
        visit=[0]*len_nums
        res=[]

        def insert():
            temp=[]
            for i in range(len_nums):
                if visit[i]:
                    temp.append(nums[i])
            res.append(temp)

        def dfs(i):
            if i==len_nums:
                insert()
                return

            visit[i]=1
            dfs(i+1)
            visit[i]=0

            dfs(i+1)

        dfs(0)
        return res 


二进制法求解思路:

主要思路就是用二进制来帮助选择元素,拿第一个例子来说,0(000)就是三个元素都没有选择,即[ ];1(001)就是选择了第三个元素,即[3]。所以我们只需要遍历0-2^{n}-1(2^{n}:1<<n)即可。如果当下遍历到了6(110,这里记为 i ),那么该怎么获取第几个元素被选择了呢,就依次判别 i & (1<< j ),j 的范围是0-len(nums),如果 i 的第 j 位为1,那么说明第 j 位被选择,同时 i & (1<< j )不为0,该位被记录。

代码:


C++:

class Solution {
public:
    vector<int> g;
    vector<vector<int>> res;
    vector<vector<int>> subsets(vector<int>& nums) {
        //用二进制来帮助元素选择(0-2^len)
        int len=nums.size();
        int temp=1<<len;
        for(int i=0;i<temp;i++){
            g.clear();
            for(int j=0;j<len;j++){
                if(i & (1<<j)){
                    g.push_back(nums[j]);
                }
            }
            res.push_back(g);
        }
        return res;
    }
};

Python:

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        g=[]
        res=[]
        len_nums=len(nums)
        temp=1<<len_nums
        for i in range(temp):
            g.clear()
            for j in range(len_nums):
                if i&(1<<j):
                    g.append(nums[j])
            res.append(g.copy())
        return res

注意这句话:

res.append(g.copy())

res.append(g)
#当您将 g 添加到 res 中时,您实际上是在添加对 g 的引用,而不是它的一个副本。因此,当您清空 g 或者之后对 g 做任何修改时,res 中已经添加的那些 g 的引用也会反映这些修改。

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

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

相关文章

新版 mac 浏览器乱码

现象 如下图&#xff0c;chrome 浏览器有的乱码了 解决方法 删除字体集中的微软雅黑&#xff08;下图已删除&#xff09;&#xff0c;右键移除

aac可以直接改成mp3吗?快速转换的3个方法~

AAC&#xff08;Advanced Audio Coding&#xff09;文件格式的诞生源于对音频压缩技术的不断追求。由Fraunhofer IIS、杜比实验室、AT&T、索尼等联合开发&#xff0c;旨在提供更高质量的音频压缩效果。AAC文件格式因其出色的音质和高效的压缩算法&#xff0c;成为数字音频领…

NVIDIA NCCL 源码学习(十三)- IB SHARP

背景 之前我们看到了基于ring和tree的两种allreduce算法&#xff0c;对于ring allreduce&#xff0c;一块数据在reduce scatter阶段需要经过所有的rank&#xff0c;allgather阶段又需要经过所有rank&#xff1b;对于tree allreduce&#xff0c;一块数据数据在reduce阶段要上行…

Linux中路径正确但是就是查找不到某个文件

显示文件不存在 Py4JJavaError&#xff1a;调用 o223.partitions 时出错。 &#xff1a; org.apache.hadoop.mapred.InvalidInputException&#xff1a; 输入路径不存在&#xff1a; 首先确定路径是否正确&#xff0c;文件是否存在 然后右键文件查看属性&#xff0c;确定文件…

matlab simulink 电力系统同步发电机励磁系统的建模与仿真

1、内容简介 略 77-可以交流、咨询、答疑 电力系统同步发电机励磁系统的建模与仿真 建立MATLAB的同步发电机励磁调节系统仿真模型&#xff0c;最后建立了以PID和PSS为励磁控制方式的同步发电机励磁调节系统数学模型&#xff0c;在Simulink环境下进行了仿真&#xff0c;收到…

爬虫逆向sm3和sm4 加密 案例

注意&#xff01;&#xff01;&#xff01;&#xff01;某XX网站逆向实例仅作为学习案例&#xff0c;禁止其他个人以及团体做谋利用途&#xff01;&#xff01;&#xff01; 案例--aHR0cDovLzExMS41Ni4xNDIuMTM6MTgwODgvc3Vic2lkeU9wZW4 第一步&#xff1a;分析页面和请求方式 …

C++利用开散列哈希表封装unordered_set,unordered_map

C利用开散列哈希表封装unordered_set,unordered_map 一.前言1.开散列的哈希表完整代码 二.模板参数1.HashNode的改造2.封装unordered_set和unordered_map的第一步1.unordered_set2.unordered_map 3.HashTable 三.string的哈希函数的模板特化四.迭代器类1.operator运算符重载1.动…

Vue2(七):脚手架、render函数、ref属性、props配置项、mixin(混入)、插件、scoped样式

一、脚手架结构&#xff08;Vue CLI&#xff09; ├── node_modules ├── public │ ├── favicon.ico: 页签图标 │ └── index.html: 主页面 ├── src │ ├── assets: 存放静态资源 │ │ └── logo.png │ │── component: 存放组件 │ │ …

未来已来?国内10家AI大模型盘点(附体验网址)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1、阿里云——通义千问2、科大讯飞——星火大模…

Cookie使用

文章目录 一、Cookie基本使用1、发送Cookie2、获取Cookie 二、Cookie原理三、Cookie使用细节 一、Cookie基本使用 1、发送Cookie package com.itheima.web.cookie;import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.I…

嵌入式开发--获取STM32产品系列的信息

嵌入式开发–获取STM32产品系列和容量信息 获取STM32产品系列 有时候我们需要知道当前MCU是STM32的哪一个系列&#xff0c;这当然可以从外部丝印看出来&#xff0c;但是运行在内部的软件如何知道呢&#xff1f; ST为我们提供了一个接口&#xff0c;对于STM32的所有MCU&#x…

宏宇、萨米特、新明珠、金意陶、简一、科达、力泰、道氏、SITI BT、POPPI……35家参展商发布亮点

3月18日&#xff0c;2024佛山潭洲陶瓷展&#xff08;4月18-22日&#xff09;亮点发布会在广东新媒体产业园成功举办&#xff0c;主题为“我们不一样”。 陶城报社社长、佛山潭洲陶瓷展总经理李新良代表主办方&#xff0c;发布了2024佛山潭洲陶瓷展的“不一样”&#xff1b;佛山…

TikTok账号用什么IP代理比较好?

对于运营TikTok的从业者来说&#xff0c;IP的重要性自然不言而喻。 在其他条件都正常的情况下&#xff0c;拥有一个稳定&#xff0c;纯净的IP&#xff0c;你的视频起始播放量很可能比别人高出不少&#xff0c;而劣质的IP轻则会限流&#xff0c;重则会封号。那么&#xff0c;如何…

FPGA - SPI总线介绍以及通用接口模块设计

一&#xff0c;SPI总线 1&#xff0c;SPI总线概述 SPI&#xff0c;是英语Serial Peripheral interface的缩写&#xff0c;顾名思义就是串行外围设备接口。串行外设接口总线(SPI)&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的…

Day16:LeedCode 104.二叉树的最大深度 111.二叉树最小深度 222.完全二叉树的结点个数

104. 二叉树的最大深度 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 思路:根结点最大深度max(左子树最大深度,右子树最大深度)1 终止条件,结点为null,该结点最大深度为0 class Solution {publ…

【什么是Internet?网络边缘,网络核心,分组交换 vs 电路交换,接入网络和物理媒体】

文章目录 一、什么是Internet&#xff1f;1.从具体构成角度来看2.从服务角度来看 二、网络结构1.网络边缘1.网络边缘&#xff1a;采用网络设施的面向连接服务1.1.目标&#xff1a;在端系统之间传输数据1.2.TCP服务 2.网络边缘&#xff1a;采用网络设施的无连接服务2.1目标&…

MT管理器 使用手册

MT管理器 论坛&#xff1a;https://bbs.binmt.cc/ 使用技巧系列教程&#xff1a;https://www.52pojie.cn/thread-1259872-1-1.html MT管理器 使用手册 &#xff1a;https://mt2.cn/guide/&#xff1a;https://www.bookstack.cn/read/mt-manual/80b8084f6be128c0.md&#xff…

HC-SR501人体红外传感器

一、传感器介绍 二、代码 void infrared_Init(void) { GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);GPIO_InitStructure.GPIO_Pin GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN;GPIO_InitStructure.GPIO_OT…

jsp 3.21(3)jsp基本语法

一、实验目的 jsp标记、如指令标记&#xff0c;动作标记&#xff1b;变量和方法的声明&#xff1b;Java程序片&#xff1b;Java表达式&#xff1b; 二、实验项目内容&#xff08;实验题目&#xff09; 1、编写jsp文件&#xff0c;熟悉jsp动作标记include&#xff0c;参考课本上…

python之jsonpath的使用

文章目录 介绍安装语法语法规则举例说明 在 python 中使用获取所有结构所有子节点的作者获取所有子孙节点获取所有价格取出第三本书的所有信息取出价格大于70块的所有书本从mongodb 中取数据的示例 介绍 JSONPath能在复杂的JSON数据中 查找和提取所需的信息&#xff0c;它是一…