从零开始的力扣刷题记录-第八十七天

2023-10-10 03:44

本文主要是介绍从零开始的力扣刷题记录-第八十七天,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

力扣每日四题

  • 129. 求根节点到叶节点数字之和-中等
  • 130. 被围绕的区域-中等
  • 437. 路径总和 III-中等
  • 376. 摆动序列-中等
  • 总结

129. 求根节点到叶节点数字之和-中等

题目描述:
给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。
每条从根节点到叶节点的路径都代表一个数字:
例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。
计算从根节点到叶节点生成的 所有数字之和 。
叶节点 是指没有子节点的节点。

题解:
简单的深度优先搜索就可以解决

代码(Go):

func sumNumbers(root *TreeNode) int {return dfs(root,0)
}func dfs(root *TreeNode,sum int) int {if root == nil {return sum}sum = sum * 10 + root.ValNewSum := 0if root.Left == nil && root.Right == nil{return sum}if root.Left != nil{NewSum += dfs(root.Left,sum)}if root.Right != nil{NewSum += dfs(root.Right,sum)}return NewSum
}

130. 被围绕的区域-中等

题目描述:
给你一个 m x n 的矩阵 board ,由若干字符 ‘X’ 和 ‘O’ ,找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。

题解:
没有被包围的O一定与边界上的O相连,所以可以反过来从边界上的O开始找到所有相连的O并标记,最后遍历矩阵,被标记的O变回O,没有被标记的O改为X

代码(Go):

func solve(board [][]byte)  {for i := 0;i < len(board);i++{for j := 0;j < len(board[0]);j++{if (i == 0 || j == 0 || i == len(board) - 1 || j == len(board[0]) - 1) && board[i][j] == 'O'{checkout(board,i,j)board[i][j] = '1'}}}for i := 0;i < len(board);i++{for j := 0;j < len(board[0]);j++{if board[i][j] == '1'{board[i][j] = 'O'}else{board[i][j] = 'X'}}}return
}func checkout(board [][]byte,x int,y int) {if x - 1 >= 0 && board[x - 1][y] == 'O'{board[x - 1][y] = '1'checkout(board,x - 1,y)}if y - 1 >= 0 &&board[x][y - 1] == 'O'{board[x][y - 1] = '1'checkout(board,x,y - 1)}if x + 1 < len(board) && board[x + 1][y] == 'O'{board[x + 1][y] = '1'checkout(board,x + 1,y)}if y + 1 < len(board[0]) && board[x][y + 1] == 'O'{board[x][y + 1] = '1'checkout(board,x,y + 1)}return
}

437. 路径总和 III-中等

题目描述:
给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。
路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

题解:
代码写麻烦了,官方题解更容易懂。我的思路是用一个flag变量标记此节点是否必选,如果此节点的父节点已经被选中到路径中则该节点必须被选择,然后就是常规的深度优先搜索统计即可

代码(Go):

func pathSum(root *TreeNode, targetSum int) int {return search(root,targetSum,0)
}func search(root *TreeNode,targetSum int,flag int) int {if root == nil{return 0}if root.Val == targetSum && flag == 0{return 1 + search(root.Left,0,1) + search(root.Right,0,1) + search(root.Left,targetSum,0) + search(root.Right,targetSum,0)}else if root.Val == targetSum && flag == 1{return 1 + search(root.Left,0,1) + search(root.Right,0,1)}else if flag == 0{return search(root.Left,targetSum,0) + search(root.Right,targetSum,0) + search(root.Left,targetSum - root.Val,1) + search(root.Right,targetSum - root.Val,1)}else{return search(root.Left,targetSum - root.Val,1) + search(root.Right,targetSum - root.Val,1)}
}

376. 摆动序列-中等

题目描述:
如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。
例如, [1, 7, 4, 9, 2, 5] 是一个 摆动序列 ,因为差值 (6, -3, 5, -7, 3) 是正负交替出现的。
相反,[1, 4, 7, 2, 5] 和 [1, 7, 4, 5, 5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。
子序列 可以通过从原始序列中删除一些(也可以不删除)元素来获得,剩下的元素保持其原始顺序。
给你一个整数数组 nums ,返回 nums 中作为 摆动序列 的 最长子序列的长度 。

题解:
子序列问题直接想到动态规划,整体思路和最长递增子序列问题基本一致,但是因为每次判断dp[i]时都需要和前面所有的位置依次对比,所以时间复杂度是O(n²),官方题解使用了两个dp数组分别表示最后一个元素是上升状态的上升数组和最后一个元素是下降状态的下降数组,两个数组的第n个状态都可以通过两个数组的n-1个状态共同得出,这样既使时间复杂度降到了O(n),也使空间复杂度降到了O(1),具体可以看下官方题解

代码(Go):

func wiggleMaxLength(nums []int) int {dp := make([]int,len(nums))sign := make([]int,len(nums))for i := 0;i < len(nums);i++{if i == 0{dp[i] = 1sign[i] = 0}else if i == 1{if nums[i] > nums[0]{sign[i] = 1dp[i] = 2}else if nums[i] < nums[0]{sign[i] = -1dp[i] = 2}else{sign[i] = 0dp[i] = 1}}else{max := 0for j := 0;j < i;j++{if sign[j] == 1 && nums[i] < nums[j]{if dp[j] + 1 > max{max = dp[j] + 1sign[i] = -1}}else if sign[j] == -1 && nums[i] > nums[j]{if dp[j] + 1 > max{max = dp[j] + 1sign[i] = 1}}else if sign[j] == 0{if dp[j] + 1 > max && nums[i] > nums[j]{max = dp[j] + 1sign[i] = 1}else if dp[j] + 1 > max && nums[i] < nums[j]{max = dp[j] + 1sign[i] = -1}}}dp[i] = max}}max := 0for i := 0;i < len(nums);i++{if dp[i] > max{max = dp[i]}}return max
}

总结

终于忙完了一个大阶段,正式回归!但是因为现在还要上课而且两道简单两道中等现在变成了四道中等,所以不一定能保证每天全靠自己做完四道题了,只能说尽量完成,如果时间不够的话就只能把没解出来看了题解的题也搬上来了

这篇关于从零开始的力扣刷题记录-第八十七天的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/177701

相关文章

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/

统一返回JsonResult踩坑的记录

《统一返回JsonResult踩坑的记录》:本文主要介绍统一返回JsonResult踩坑的记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录统一返回jsonResult踩坑定义了一个统一返回类在使用时,JsonResult没有get/set方法时响应总结统一返回

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

java对接海康摄像头的完整步骤记录

《java对接海康摄像头的完整步骤记录》在Java中调用海康威视摄像头通常需要使用海康威视提供的SDK,下面这篇文章主要给大家介绍了关于java对接海康摄像头的完整步骤,文中通过代码介绍的非常详细,需... 目录一、开发环境准备二、实现Java调用设备接口(一)加载动态链接库(二)结构体、接口重定义1.类型

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

apache的commons-pool2原理与使用实践记录

《apache的commons-pool2原理与使用实践记录》ApacheCommonsPool2是一个高效的对象池化框架,通过复用昂贵资源(如数据库连接、线程、网络连接)优化系统性能,这篇文章主... 目录一、核心原理与组件二、使用步骤详解(以数据库连接池为例)三、高级配置与优化四、典型应用场景五、注意事

SpringBoot实现文件记录日志及日志文件自动归档和压缩

《SpringBoot实现文件记录日志及日志文件自动归档和压缩》Logback是Java日志框架,通过Logger收集日志并经Appender输出至控制台、文件等,SpringBoot配置logbac... 目录1、什么是Logback2、SpringBoot实现文件记录日志,日志文件自动归档和压缩2.1、