【力扣100】46.全排列

添加链接描述

class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
        # 思路是使用回溯
        if not nums:
            return []
        
        def dfs(path,depth,visited,res):
            # 出递归的条件是当当前的深度已经和nums的长度一样了,把path加入数组,然后出递归
            if len(nums)==depth:
                res.append(path[:])
                return 
            
            for i in range(len(nums)):
                if visited[i]==False:
                    visited[i]=True
                    path.append(nums[i])
                    dfs(path,depth+1,visited,res)
                    path.pop()
                    visited[i]=False

        visited=[False]*len(nums)
        res=[]
        dfs([],0,visited,res)
        return res                 

思路:

  1. 这是一道很能体现回溯思想的题目,很容易想到这样的解题思路[1]+[2,3],也就是先选出一个,把后面的进行递归

  2. 在选择了[1,2,3]之后,要进行回溯,就是把之前加入path中的弹出,然后再重置标志
    在这里插入图片描述

  3. 回溯结束条件是,当当前depth等于数组长度时,就进行收获操作,这里是否有return都无所谓,因为是对叶子节点加入res的操作

  4. 所以定义的func的参数有:当前深度depth,用来记录当前结果的path,一个visited数组用来排除已经访问过的元素,也就是将已经在路径上的节点排除出去,res用来接收总结果

出递归时,为什么使用path[:]而不是path本身?

  • 变量 path 所指向的列表 在深度优先遍历的过程中只有一份 ,深度优先遍历完成以后,回到了根结点,成为空列表。

引用传递和拷贝(path&&path[:])

  • 在Python中,列表是可变对象,而可变对象函数参数传递时是通过引用传递的方式进行的。这意味着当你将一个列表作为参数传递给一个函数时,函数内部操作的是这个列表对象的引用,而不是列表对象的副本
  • 当你在函数内部修改了传入的列表对象时,这些修改会直接影响到原始列表,因为它们指向同一个对象。这种行为称为引用传递或者叫按引用传递。
def modify_list(some_list):
    some_list.append(4)  # 在传入的列表末尾添加一个元素

my_list = [1, 2, 3]
modify_list(my_list)
print(my_list)  # 输出 [1, 2, 3, 4]

  • 在这个例子中,modify_list函数内部的操作直接影响了原始的my_list列表,因为传递的是my_list的引用。
  • 但是,在回溯或递归等需要对列表进行多次修改并且保存不同状态的情况下,我们可能需要确保每个状态的独立性,避免相互影响。这时候,可以使用list.copy()或[:]切片操作创建列表的副本,以便在函数调用或操作过程中不影响原始列表。

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

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

相关文章

手机流量卡推广分销网站php源码,多功能的号卡推广分销管理系统

源码简介 拥有多个接口,包括运营商接口,并支持无限三级代理。 最简单易用的PHP系统,它自带自动安装向导,可以让你轻松安装和部署。 该系统集成了多个第三方接口资源,能够满足你的不同需求。采用全系统双色主题&…

Python 自学(二) 之流程控制语句

目录 1. if ... elif ... else 语句 P62 2. True False 3. for 数值循环 in range() P69 4. for 遍历字符串,列表,元组,集合和字典 in obj P70 5. pass 空语句 1. if ... elif ... else 语句 P62 每个判断语句后面要加 :elif …

机器学习中的监督学习基本算法-逻辑回归简单介绍

逻辑回归 逻辑回归(Logistic Regression)是一种用于解决二分类问题的统计学习方法,尽管名字中带有"回归"一词,但实际上它是一种分类算法。逻辑回归的主要目标是通过学习从输入特征到一个离散的输出(通常是0…

log4cplus visual c++ 编译及调试小记

简介 最近在调试一款SATA加密设备,发现设备有时加密出来的数据,再解密时与明文对不上,怀疑是通信问题。因此,急需要在测试工具中加入通信日志。由于对第三方日志库都不熟悉,所以随便选了个log4cplus软件集成到现有工具…

以STM32为例,实现按键的短按和长按

以STM32为例,实现按键的短按和长按 目录 以STM32为例,实现按键的短按和长按1 实现原理2 实现代码3 测试结束语 1 实现原理 简单来说就是通过设置一个定时器来定时扫描几个按键的状态,并分别记录按键按下的持续时间,通过时间的长短…

百度百科词条创建多久可以通过?

一个优质的百度百科词条,能提升个人或企业的品牌形象。因此,越来越多的人希望创建自己的百度百科词条,那么,创建一个百度百科词条到底需要多久才能通过审核呢?接下来伯乐网络传媒就来给大家分享一下。 一、百度百科词条…

【Qt之Quick模块】7. Quick基础、常用组件Item、Rectangle、Text、TextInput、TextEdit等

1. 概述 Qt Quick模块是编写QML应用程序的标准库。Qt QML模块提供QML引擎和语言基础结构,Qt Quick模块提供用QML创建用户界面所需的所有基本类型。它提供了一个可视化画布,包括用于创建和动画化可视化组件、接收用户输入、创建数据模型和视图以及延迟对…

静态网页设计——海贼王

前言 使用前端经典三件套HTMLCSSJS实现的海贼王静态网页课程设计,适合我们的童年! 主要内容 首页 首页最上方有一个轮播图,可以自动切换图片,使用js实现。 轮播图往下,就是列出一些比较经典的海贼王影片&#xf…

2023年度最热 AI 应用 TOP 50,除了 ChatGPT 还有这么多宝藏

原文章链接:年度最热 AI 应用 TOP 50,除了 ChatGPT 还有这么多宝藏 - IT之家 更多消息:AI人工智能行业动态,aigc应用领域资讯 在 AI 工具激烈竞争的一年中,尽管ChatGPT在访问量上遥遥领先,但单次使用时长未…

Python之字符编码汇总

一、常见编码 ASCII:ASCII码即美国标准信息交换码(American Standard Code for Information Interchange)。由于计算机内部所有信息最终都是一个二进制值,而每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以…

gookit/color - Go语言命令行色彩使用库教程

gookit/color - Go语言命令行色彩使用库教程 1.安装2.基础颜色(16-color)3.256色彩/RGB风格 1.安装 go get github.com/gookit/color2.基础颜色(16-color) 提供通用的API方法:Print Printf Println Sprint Sprintf 1、例如: color.Yellow.Println(&q…

centos7 ping不通域名

如果ip能ping通,ping不通域名可以试试以下操作: 1.编辑resolv.conf文件 vi /etc/resolv.conf 添加 nameserver 8.8.8.8 2.编辑nsswitch.conf vi /etc/nsswitch.conf 改成下图所示: 3.编辑sysctl.conf vi /etc/sysctl.conf 加上两行内…

macOS跨进程通信: FIFO(有名管道) 创建实例

一: 简介 在类linux系统中管道分为有名管道和匿名管道。两者都能单方向的跨进程通信。 匿名管道(pipe): 必须是父子进程之间,而且子进程只能由父进程fork() 出来的,才能继承父进程的管道句柄,一般mac 开发…

1分钟生成爆款风景视频,Stable Video Diffusion最简教程

AI视频是2024年的重头戏,各大AI厂商都在跑视频技术,快速推出更牛的黑科技,SD其实在11月底就出了一款官方视频大模型-SVD,来跟runway、pika抢这块大蛋糕。 之前生成的视频效果还不是很理想,远没runway效果好&#xff0c…

【Mybatis】深入学习MyBatis:高级特性与Spring整合

🍎个人博客:个人主页 🏆个人专栏: Mybatis ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 高级特性 1 一级缓存和二级缓存 一级缓存 二级缓存 2 延迟加载 5 整合Spring 1 MyBatis-Spring模块 2 事务管理 结…

如何在Windows安装Wnmp服务并实现固定地址远程访问

文章目录 前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 WNMP是Windows系统下的绿色NginxMysqlPHP环境集成套件包,安装完成后即可得到一个Nginx MyS…

无辅源电压继电器 RWY-D2/3 180-440VAC 导轨安装 josef约瑟

RWY-D1型电压继电器; RWY-D2型电压继电器; 一、 概述 RWY-D系列电压继电器(以下简称本继电器)用于发电机、变压器和输电线的电器保护装置中,作为过电压保护或低电压闭锁的启动原件。本继电器为集成电路静态型继电器…

用户管理第2节课 -- idea 2023.2 创建表--鱼皮

二、【先确定idea版本&鱼皮是否一致,再决定看不看这行】建表 2.1 idea 里连接数据库,通过可视化建表 2.1.1 清空表中数据 的 命令 truncate 清空 2.1.2 先输入删除表,的命令,再选中这行命令,执行,…

Linux学习之系统编程2(关于进程及其相关的函数)

写在前面: 我的Linux的学习之路非常坎坷。第一次学习Linux是在大一下的开学没多久,结果因为不会安装VMware就无疾而终了,可以说是没开始就失败了。第二次学习Linux是在大一下快放暑假(那个时候刚刚过完考试周)&#xf…

k8s快速搭建

VMware16Pro虚拟机安装教程VMware16.1.2安装及各版本密钥CentOS7.4的安装包:提取码:lp6qVMware搭建Centos7虚拟机教程 搭建完一个镜像 关机 拍摄一个快照,克隆两个作为子节点 0. 环境准备 在开始之前,部署Kubernetes集群机器需要满足以下几个条件&#…