leetcode 104.二叉树的深度
个人网站:https://leiqicn.gitee.io/categories/leetcode/104. 二叉树的最大深度 - 力扣(Leetcode) 二叉树节点的深度指的是该节点到根节点的距离,也就是从根节点到该节点的路径长度。而二叉树节点的高度指的是该节点到其子树中最远叶子节点的距离,也就是该节点为根的子树的高度。 所以,可以将整个二叉树的高度定义为根节点的高度,也就是从根节点到最远叶子节点的距离。而整个二叉树的深度则没有固定的定义,通常是指二叉树中节点深度的最大值。 递归123456789101112131415func max (a, b int) int { if a > b { return a; } return b;}// 递归func maxdepth(root *treenode) int { if root == nil { return 0; } return max(maxdepth(root.left),...
leetcode 122买动态股票的最佳时机II
122. 买卖股票的最佳时机 II - 力扣(Leetcode) 每次只允许在一天买入一支股票,在之后某个时间卖出它。同时,你也可以选择不进行任何交易。 相比于第一题买卖股票的最佳时机(只能进行一次交易),这道题没有限制交易次数,因此我们应该从一个更灵活的角度去考虑如何进行交易。 下面是代码解释: 首先定义变量 sum 记录当前总利润。然后从第二个价格开始遍历,计算当日价格与前一天价格之差。如果价格上涨了,则将当前利润加上买卖差价,否则不进行操作。最后返回累计的总利润。这样做的原理在于,如果在 i 天买入,在 j 天卖出(j > i),我们可以等价于在 i+1、i+2……j-1、j 这些连续的日子里都进行了购入和卖出,而我们所需获得的利润即为这些差价的总和。因此,代码中只统计了所有价格差大于 0 的部分,而将其他价格差为负值的日子抛弃掉了。 12345678910func maxProfit(prices []int) int { var sum int for i := 1; i < len(prices); i++ { ...
leetcode 1091.二进制矩阵中的最短路径
1091. 二进制矩阵中的最短路径 - 力扣(Leetcode)DFS 超时版本: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950type point struct { x int y int}func shortestPathBinaryMatrix(grid [][]int) int { n := len(grid) if grid[0][0] == 1 || grid[n-1][n-1] == 1 { return -1 } res := 0 dirs := [][]int{{-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1,...
leetcode 53.最大子数和
Problem: 53. 最大子数组和 个人网站: https://leiqicn.gitee.io/categories/leetcode/[TOC] 思路 这里是经典的最大子序和的问题。我们可以很容易想到贪心的思想。就是如果前边的子序和是正数,则我们会把当前的数添加到前面的子序和上。否则,重新从当前位置开始子序和,丢弃前边的子序和。 解题方法 方法1 算法通过遍历整个数组nums,维护一个当前连续子序列的和count,同时记录一个最大值res。每遍历一个元素,就将其加入到count中,并比较它与之前计算过的最大子序和res的大小关系,如果大于res,则更新res。并且当count变成负数时,就说明需要重新寻找连续子序列,因此将count重置为0。 方法2 使用了类似动态规划的思想,用nums 数组代表dp数组; dp[i]含义:dp 表示最大子序列,i 代表当前位置的最大子序列的值;dp[i+1] = dp[i] +dp[i+1] ;max 初始化为第一个元素nums0; 遍历顺序,从idx = 1 开始遍历。 复杂度 时间复杂度: ...
go语言-回调函数(钩子)
在Go语言中,回调函数和钩子函数通常是使用函数类型作为参数传递给函数或方法,以便在特定事件发生时被调用。这种机制非常灵活,可以让你编写出高效的、可复用的代码。 以下是一个简单的例子,展示了如何使用回调函数来实现一个函数,当输出文本时会同时调用传入的回调函数: 123456789101112131415161718package mainimport ( "fmt")func printWithCallback(callback func(string)) { text := "Hello, world!" fmt.Println(text) callback(text)}func main() { callback := func(text string) { fmt.Printf("Printed: %s\n", text) } ...
leetcode 376.摆动序列
376. 摆动序列 - 力扣(Leetcode) 12345678910111213141516171819func wiggleMaxLength(nums []int) int { var count, preDiff, curDiff int count = 1 // 初始化计数为1,至少有一个数字是有效的 if len(nums) < 2 { return count // 如果数组长度小于2,直接返回计数值 } for i := 0; i < len(nums)-1; i++ { curDiff = nums[i+1] - nums[i] // 计算当前数字之间的差值 // 根据差值的正负和前一个差值的正负进行判断 // 如果满足摆动序列的条件,更新前一个差值和计数值 if (curDiff > 0 && preDiff <= 0) || (preDiff >= 0...
leetcode 226. 翻转二叉树
226. 翻转二叉树 - 力扣(Leetcode) 1234567891011121314151617181920212223/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ // 定义将二叉树翻转func invertTree(root *TreeNode) *TreeNode { // 递归终止条件 if root == nil { return nil } // 单个任务逻辑 交换root 下的两个节点,然后在严格按照定义递归调用左右节点 root.Right,root.Left = root.Left,root.Right // 将右子树翻转 invertTree(root.Right) // 将左子树翻转 ...
leetcode 144. 二叉树的前序遍历
144. 二叉树的前序遍历 - 力扣(Leetcode) 记得提前判断是否为空,否则会报找不到内存指针的错误 注意:这里和层序遍历不一样,这里不用使用中间变量lens := stack.len() 来遍历每层,虽然增加了每层遍历依然可以通过,但是没有必要。只有在层序遍历的时候才需要记录每层的信息。leetcode 102. 二叉树的层序遍历 12345678910111213141516171819202122232425262728/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */func preorderTraversal(root *TreeNode) []int { stack := list.New() res := []int{} if root ==...
leetcode 102. 二叉树的层序遍历
102. 二叉树的层序遍历 - 力扣(Leetcode) 使用slice123456789101112131415161718192021222324252627282930313233343536373839404142/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */func levelOrder(root *TreeNode) [][]int { // 层序遍历 使用size 记录每层数组 queue node 队列 res := make([][]int, 0) queue := make([]*TreeNode, 0) if root != nil { queue = append(queue, root) } else { return res ...
leetcode 1845.座位预约管理系统
1845. 座位预约管理系统 - 力扣(Leetcode) 超时版本123456789101112131415161718192021222324252627282930313233type seat struct { seatId int isFree int // 空}type SeatManager struct { seats map[int]*seat isFrees []int // 可预约的使用list 保存一份,记得被占用的时候,删除该座位,空缺则添加}func Constructor(n int) SeatManager { var a = SeatManager{make(map[int]*seat, n), make([]int, n)} for i := 0; i < n; i++ { id := i + 1 a.seats[id] = &seat{id, 1} a.isFrees[i] = id //...