【力扣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]=Truepath.append(nums[i])dfs(path,depth+1,visited,res)path.pop()visited[i]=Falsevisited=[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()或[:]切片操作创建列表的副本,以便在函数调用或操作过程中不影响原始列表。

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

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

相关文章

Java 将Excel转换为TXT文本格式

TXT文件是一种非常简单、通用且易于处理的文本格式。在处理大规模数据时,将Excel转为TXT纯文本文件可以提高处理效率。此外,许多编程语言和数据处理工具都有内置的函数和库来读取和处理TXT文件,因此将Excel文件转换为TXT还可以简化数据导入过…

【网络技术】【Kali Linux】Wireshark嗅探(四)域名系统(DNS)

一、实验目的 本次实验使用wireshark流量分析工具进行网络嗅探,旨在了解域名系统(DNS)的工作原理。 二、域名系统概述 简单来说,域名系统(Domain Name System, DNS)将域名(可以理解为“网址”…

小肥柴慢慢手写数据结构(C篇)(5-2 AVL树)

小肥柴慢慢学习数据结构笔记(C篇)(5-2 AVL树 目录5-5 AVL出现的原因5-5-1 平衡树5-5-2 平衡二叉树的具体案例 5-6 AVL平衡策略的讨论5-7 不使用平衡因子的实现(黑皮书,训练思维)5-8 使用平衡因子的实现&…

java的mybatis

一.spring 整合单元测试 二.lombok 三.注解方式开发 四.xml 方式开发 五.动态sql

STL-string

目录 💡介绍 💡string的基本操作 💡string的构造函数 💡string赋值操作 💡string字符串拼接 💡string的查找和替换 💡string字符串比较 💡string字符存取 💡str…

Qt6.5类库详解:QFontComboBox

哈喽大家好,欢迎关注公众号(20YC编程),有免费视频课程哦! -今日内容- 1 QFontComboBox介绍 QFontComboBox是Qt框架中的一个字体选择类,它提供了一个下拉列表框,用于选择字体。 QFontComboBox的主要功能和特点&#x…

统信UOS操作系统上扩容数据盘

原文链接:统信UOS操作系统上扩容数据盘 hello,大家好啊!今天我要给大家介绍的是在统信UOS操作系统上扩容数据盘的方法。在使用UOS的过程中,随着数据的不断增加,原有磁盘空间可能会变得不足,这时候就需要对数…

C++ DAY6 作业

1.用模板类写顺序表 #include <iostream>using namespace std;#define MAXSIZE 10 template <typename T> class Arr {T *data NULL;int len 0; public://构造函数Arr():data(new T){}Arr(T a,int len):data(new T(a)),len(len){}//析构函数~Arr(){delete data;}…

C语言文件操作(2)

目录 6. 文本文件和二进制文件 7. 文件读取结束的判定 7.1 被错误使用的feof 8. 文件缓冲区 6. 文本文件和二进制文件 根据数据的组织形式&#xff0c;数据文件被称为文本文件或者二进制文件。 数据在内存中以二进制的形式存储&#xff0c;如果不加转换的输出到外存&#xff…

Python for与while循环的介绍和对应练习题的巩固

for循环 重复执行同一段代码就是循环 循环列表 for val in list_name: list_num [1,2,3,4,5,6,7,8,9] for i in list_num:print(i)代码执行顺序 从上往下依次执行 遍历 通过某种顺序把某种集合所有元素都访问一遍 list_food{"火锅","烧烤","张…

微信公众号请求获取相关权限后端代码

用微信的东西&#xff0c;总要避免到各种与微信那边的交互。 1.首先要有个接口&#xff0c;证明你是服务端&#xff08;填写服务器配置&#xff09; 接入概述 | 微信开放文档 主代码 /*** 服务器配置验证* param* return*/PassTokenGetMapping("/giveWxCheck")publi…

一文讲清数据资产入表实操

《中共中央 国务院关于构建数据基础制度更好发挥数据要素作用的意见》已发布一年&#xff0c;数据资产化和入表已成为2023年的热门话题&#xff0c;随着2023年底国家数据局吹风《"数据要素x"三年行动计划&#xff08;2024-2026年&#xff09;》即将发布&#xff0c;这…