【力扣hot100】刷题笔记Day17

news2025/2/24 3:24:34

前言

  • 今天竟然不用开组会!天大的好消息,安心刷题了

46. 全排列 - 力扣(LeetCode)

  • 回溯(排列)

    • class Solution:
          def permute(self, nums: List[int]) -> List[List[int]]:
              # 回溯
              def backtrack():
                  if len(path) == len(nums):
                      res.append(path[:])  # 如果path长度达到要求,收集结果,注意python要拷贝res
                      return 
                  for i in range(len(nums)):
                      if used[i] == 0:  # 遍历所有没用过的
                          used[i] = 1
                          path.append(nums[i])
                          backtrack()
                          path.pop()  # 撤销
                          used[i] = 0  # 撤销
              # 可变对象在函数中可以直接改不需要作为参数,也不需要写self,只有赋值需要
              # 比如:递归里self.res= max(self.res,l+r)需要用self或递归里nonlocal res声明
              n = len(nums)
              used = [0] * n
              path = []
              res = []
              backtrack()
              return res
  • 回溯(交换填充)

    • class Solution:
          def permute(self, nums: List[int]) -> List[List[int]]:
              def backtrack(first = 0):
                  # 所有数都填完了
                  if first == n:  
                      res.append(nums[:])
                  for i in range(first, n):
                      # 动态维护数组
                      nums[first], nums[i] = nums[i], nums[first]
                      # 继续递归填下一个数
                      backtrack(first + 1)
                      # 撤销操作
                      nums[first], nums[i] = nums[i], nums[first]
              
              n = len(nums)
              res = []
              backtrack()
              return res

 78. 子集 - 力扣(LeetCode)

  • 回溯(组合)

    • class Solution:
          def subsets(self, nums: List[int]) -> List[List[int]]:
              def backtrack(start=0):
                  res.append(path[:])  # 每到一个节点就传一次答案
                  # if start == n: return  # 下面的for循环隐含这个终止条件
                  for i in range(start, n):
                      path.append(nums[i])
                      backtrack(i+1)  # 注意这里传入的是i+1
                      path.pop()
              n = len(nums)
              res = []
              path = []
              backtrack(0)
              return res
      

17. 电话号码的字母组合 - 力扣(LeetCode) 

  • 回溯(不同集合的组合)

    • class Solution:
          def letterCombinations(self, digits: str) -> List[str]:
              def backtrack(index = 0):
                  if index == len(digits):
                      res.append("".join(path))  # 不用传复制因为已经新建字符串了
                      return
                  s = mp[int(digits[index])]  # 取出对应数字的字符串
                  for c in s:
                      path.append(c)
                      backtrack(index+1)
                      path.pop()
              if len(digits) == 0:
                  return []
              mp = ['', '', 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz']  # 下标号码映射字符串
              path = []
              res = []
              backtrack()
              return res

39. 组合总和 - 力扣(LeetCode) 

  • 回溯(排序剪枝)

    • class Solution:
          def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
              path = []
              res = []
              n = len(candidates)
              def backtrack(start, target):
                  if target < 0: return    # 剪枝返回上一层,后面更大的数就没必要减了
                  if target == 0:
                      res.append(path[:])
                      return
                  for i in range(start, n):
                      path.append(candidates[i])
                      backtrack(i, target-candidates[i])  # 传i而不是i+1说明当前数可以重复选
                      path.pop()
              candidates.sort()  # 剪枝,排序后大的数在后面选择优先级低
              backtrack(0, target)
              return res

 22. 括号生成 - 力扣(LeetCode)

  • 回溯(组合)

    • 这个题解结合官解就能看懂了,主要在于括号合法性判断上
    • class Solution:
          def generateParenthesis(self, n: int) -> List[str]:
              if n <= 0: return n
              res = []
      
              def backtrack(path, left, right):
                  # 两种情况需要剪枝
                  # 1.左括号多于n了:((((
                  # 2.右括号多于左括号:())
                  if left > n or right > left: return
                  if len(path) == 2 * n:  # 因为括号都是成对出现的
                      res.append(path)
                      return
                  backtrack(path + '(', left + 1, right)  # 生成一个加一个
                  backtrack(path + ')', left, right + 1)
              backtrack('', 0, 0)
      
              return res

后言

  • 今天就到这吧,还有其他事情,感觉回溯还不熟练,脑子里模拟不太出来,待会去看看代码随想录再熟悉熟悉 

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

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

相关文章

一、前端开发

#视频链接&#xff1a;https://www.bilibili.com/video/BV1rT4y1v7uQ?p1&vd_source1717654b9cbbc6a773c2092070686a95 前端开发 前端开发1、快速开发网站2、浏览器能识别的标签2.1 编码&#xff08;head&#xff09;2.2 title(head)2.3 标题2.4 div和span练习题2.5 超链接…

如何做代币分析:以 USDT 币为例

作者&#xff1a;lesleyfootprint.network 编译&#xff1a;cicifootprint.network 数据源&#xff1a;USDT Token Dashboard &#xff08;仅包括以太坊数据&#xff09; 在加密货币和数字资产领域&#xff0c;代币分析起着至关重要的作用。代币分析指的是深入研究与代币相关…

prometheus监控带安全认证的elasticsearch

1.下载elasticsearch_exporter wget 下载二进制包并解压、运行&#xff1a; wget https://github.com/prometheus-community/elasticsearch_exporter/releases/download/v1.3.0/elasticsearch_exporter-1.3.0.linux-amd64.tar.gz tar -xvf elasticsearch_exporter-1.3.0.lin…

imazing是啥 ?iMazing 3.0.0.3中文版会有哪些新功能?

imazing是啥 imazing是管理iOS设备的软件 iMazing 是一款用于管理iOS设备的软件。它支持在Windows和Mac电脑上对基于iOS系统的设备进行数据传输、备份和管理。用户可以通过这款软件传输和备份包括照片、音乐、铃声、视频、电子书及通讯录等多种信息。不仅限于iPhone、iPad或iP…

1、docker 基础命令

1、docker 运行镜像 docker run image tag 2、创建dockerfile&#xff08;构建容器的相关命令&#xff09; vim DockerFile 3、docker 构建容器镜像 docker build -t <image_name> . 4、docker 分层 5、查看镜像 docker images 6、docker 执行 docker run --name &…

言语理解与表达-郭熙-02

1、上节回顾 1.1 转折关系 1.2 因果关系 1.3 主题词 2、本课目录 3、必要条件关系 3.1 题目 4、对策类 4.1 题目 5、反面论证 提对策 题目 6、必要关系总结 7、程度词 题目 易错&#xff1a; 8、并列关系 题目 易错&#xff1a;

Java面试题之并发

并发 1.并发编程的优缺点&#xff1f;2.并发编程三要素&#xff1f;3.什么叫指令重排&#xff1f;4.如何避免指令重排&#xff1f;5.并发&#xff1f;并行&#xff1f;串行&#xff1f;6.线程和进程的概念和区别&#xff1f;7.什么是上下文切换&#xff1f;8.守护线程和用户线程…

lv20 QT对话框3

1 内置对话框 标准对话框样式 内置对话框基类 QColorDialog, QErrorMessage QFileDialog QFontDialog QInputDialog QMessageBox QProgressDialogQDialog Class帮助文档 示例&#xff1a;各按钮激发对话框实现基类提供的各效果 第一步&#xff1a;实现组件布局&…

dolphinscheduler集群部署教程

文章目录 前言一、架构规划二、配置集群免密登录1. 配置root用户集群免密登录1.1 hadoop101节点操作1.2 hadoop102节点操作1.3 hadoop103节点操作 2. 创建用户2.1 hadoop101节点操作2.2 hadoop102节点操作2.3 hadoop103节点操作 三、安装准备1. 安装条件2. 安装jdk3. 安装MySQL…

FreeRTOS 信号量

目录 一、信号量的概念 二、二值信号量 1、二值信号量的定义 2、二值信号量的作用 3、二值信号量的操作 4、二值信号量操作实验 5、二值信号量会导致优先级翻转问题 三、互斥信号量 1、互斥信号量的引入 2、注意&#xff1a;互斥信号量不能用于中断服务函数中&#xf…

kali linux通过aircrack-ng命令破解wifi密码

相关阅读&#xff1a;如何破解攻击WiFi 百度安全验证https://baijiahao.baidu.com/s?id1764248756021219497&wfrspider&forpc上面2篇文章写得都很不错 一、前期准备工作 1、将无线网卡挂载到Kali上 ​ 将无线网卡插到电脑上&#xff0c;如果弹出检测到新的USB设备&…

戏说c语言: 阶段性总结二

前言 师弟&#xff1a;“师兄&#xff0c;我终于和我喜欢的女生在一起了。感谢师兄呀。” 我&#xff1a;“恭喜啊&#xff0c;师弟&#xff01;” 师弟&#xff1a;“这要全靠这段学习c的缘分了啊&#xff0c;两个人没事交流c语言&#xff0c;一起去上课&#xff0c;共同成长…

vue3使用echarts绘制地图

vue3使用echarts绘制地图 安装echarts npm install echarts下载地图的json数据【我这里是把json数据单独粘出来然后新建了一个文件china.json】 下载中国及各个省份的地图数据引入 import chinaJson from ./china.json绘制地图 <template><div ref"myChart&q…

申请Sectigo证书

Sectigo&#xff08;前身为Comodo CA&#xff09;&#xff0c;是目前全球最优质的网络安全服务供应商之一。该证书颁发机构主要是为各个企业的网络数据安全传输提供解决方案以及用户数据安全。 其特点也非常鲜明&#xff0c;极具性价比&#xff0c;深受中小型企业的欢迎。其证…

企业有了ERP,为什么还要上BI?

在我们以往和企业的沟通过程中&#xff0c;我们发现还是有相当多的一部分企业对于商业智能 BI 了解不多&#xff0c;或者对商业智能 BI 的理解仅停留在花花绿绿的可视化页面上&#xff0c;要么就是提出以下类似问题&#xff1a; 财务部门&#xff1a;BI 的财务分析指标也就是三…

可靠性技术之链路聚合(LACP模式)

LACP模式下&#xff0c;两端设备所选择的活动接口数目必须保持一致&#xff0c;否则链路聚合组就无法建立。此时可以使其中一端成为主动端&#xff0c;另一端(被动端)根据主动端选择活动接口。通过系统LACP优先级确定主动端&#xff0c;值越小优先级越高。 在未配置链路聚合时&…

PDF Expert for Mac v3.9.2中文激活版下载

PDF Expert for Mac是一款易于使用的 PDF 编辑器和注释器&#xff0c;专为 Mac 设备设计。它允许用户轻松查看、编辑、签名、注释和共享 PDF。该软件使用户能够向他们的 PDF 添加文本、图像、链接和形状&#xff0c;突出显示和标记文本&#xff0c;填写表格以及签署数字文档。它…

02|JVM内存模型

1. JVM整体结构及内存模型 1.1 类装载子系统 负责加载字节码文件并将其转换为可以执行的Java类。类加载器子系统包括三个主要的类加载器&#xff1a;Bootstrap ClassLoader&#xff08;引导类加载器&#xff09;、Extension ClassLoader&#xff08;扩展类加载器&#xff09;和…

输入一个整数n,输出这个整数的二进制的0和1的个数

输入一个整数n&#xff0c;输出这个整数的二进制的0和1的个数:除二取余法 代码&#xff1a; #include <cstdio> int main() {int n;scanf_s("%d", &n);int arr[2] { 0 };while (n) {int yu n % 2;arr[yu];n n / 2;}printf("0的个数是&#xff1a…

2024-02-29 作业

作业要求&#xff1a; 编写链表&#xff0c;链表里面随便搞点数据 使用 fprintf 将链表中所有的数据&#xff0c;保存到文件中 使用 fscanf 读取文件中的数据&#xff0c;写入链表中 运行代码&#xff1a; main.c #include "link.h" int main(int argc, const char…