<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>LeetCode on Tequila's 学习笔记</title><link>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/</link><description>Recent content in LeetCode on Tequila's 学习笔记</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>© 2026 Tequila</copyright><atom:link href="https://latnx.github.io/docs/notes/d-e3f7616b19908d30/index.xml" rel="self" type="application/rss+xml"/><item><title>012 前缀和与差分</title><link>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-5ed97d0c17a39aea/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-5ed97d0c17a39aea/</guid><description>利用前缀和快速得到区域累加和 子数组是数组中元素的连续非空序列。 哈希表记录前缀和到下标的映射，可求长度 差分数组用来解决典型的区间更新（Range Update）问题 前缀和长度空出零 差分空出0和n+1 可以统一设置成n+2
一维前缀和与一维差分 # // 从 1 开始 for i, num := range nums { preSum[i+1] = preSum[i] + num } // 航班预订统计 // 这里有 n 个航班，它们分别从 1 到 n 进行编号。 // 有一份航班预订表 bookings ， // 表中第 i 条预订记录 bookings[i] = [firsti, lasti, seatsi] // 意味着在从 firsti 到 lasti // （包含 firsti 和 lasti ）的 每个航班 上预订了 seatsi 个座位。 // 请你返回一个长度为 n 的数组 answer，里面的元素是每个航班预定的座位总数。 // 测试链接 : https://leetcode.</description></item><item><title>013 滑动窗口</title><link>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-8491cf98752935fa/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-8491cf98752935fa/</guid><description>问题单调才能用滑窗
sum := 0 l := 0 for r := 0; r &amp;lt; n; r++ { 更新窗口（sum += nums[r]） for 满足条件可以收缩(l &amp;lt;= r &amp;amp;&amp;amp; 条件) { sum -= nums[l] l++ } if 可以更新答案 { 更新答案（minLength = r - l + 1） } } // 窗口[l, r] 双指针
func maxArea(height []int) int { l, r := 0, len(height)-1 res := 0 for l &amp;lt;= r { res = max(res, (r-l)*min(height[l], height[r])) if height[l] &amp;lt; height[r] { l++ } else { r-- } } return res }</description></item><item><title>014 二分答案法</title><link>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-e857dd2b99409b32/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-e857dd2b99409b32/</guid><description>// 需要二分 // 简便的反向计算，如果结果是mid，那么查看另一个参数如何变化 func cal(mid int) (k int) { } func smallestDistancePair(nums []int, k int) int { l, r := 0, 可能的最大值 res := 0 for l &amp;lt;= r { mid := (l + r) / 2 if cal(mid) &amp;lt;= k { res = mid r = mid - 1 } else { l = mid + 1 } } return res }</description></item><item><title>015 单调栈</title><link>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-80a8cdefbe37d4ce/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-80a8cdefbe37d4ce/</guid><description>单调栈:快速找到每个元素左边/右边第一个比它大或小的元素
左：&amp;lt; 右：≤ func largestRectangleArea(heights []int)(res int ){ n := len(heights) stack := []int{-1} left, right := make([]int,n), make([]int,n) for index, val := range heights { for len(stack) &amp;gt; 1 &amp;amp;&amp;amp; val &amp;lt;= heights[stack[len(stack)-1]] { right[stack[len(stack)-1]] = index stack = stack[:len(stack)-1] } left[index] = stack[len(stack)-1] stack = append(stack, index) } for _, i := range stack[1:]{ right[i] = n } return }</description></item><item><title>016 单调队列</title><link>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-41dc3248a3b7f977/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-41dc3248a3b7f977/</guid><description>// 单调队列通常与滑动窗口连用, 用来求滑动窗口的最大和最小值 // 流程分为加数字和减数字两部分 // 1. 加数字从队尾进入，若是队尾大于当前数字的元素，就从队尾弹出 // 2. 减数字时，若队头过期则循环出队列 func maxSlidingWindow(nums []int, k int) []int { queue := []int{} res := make([]int, len(nums)-k+1) for i, num := range nums{ for len(queue) &amp;gt; 0 &amp;amp;&amp;amp; nums[queue[len(queue)-1]] &amp;lt;= num { queue = queue[:len(queue)-1] } queue = append(queue, i) left := i - k + 1 if queue[0] &amp;lt; left { queue = queue[1:] } if left &amp;gt;= 0{ res[left] = nums[queue[0]] } } return res }</description></item><item><title>017 并查集</title><link>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-cdf458fdcd91b6dd/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-cdf458fdcd91b6dd/</guid><description>const MAXN = 1000001 var arr [MAXN]int func build() { for i := 0; i &amp;lt; MAXN; i++ { arr[i] = i } } func find(i int) int { if arr[i] != i { arr[i] = find(arr[i]) } return arr[i] } func isSameSet(a, b int) bool { return find(a) == find(b) } func union(a, b int) { arr[find(a)] = find(b) }</description></item><item><title>018 洪水填充</title><link>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-9b0965c8adda57df/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-9b0965c8adda57df/</guid><description>func dfs(grid [][]byte, i, j int) { if i &amp;lt; 0 || i &amp;gt;= len(grid) || j &amp;lt; 0 || j &amp;gt;= len(grid[0]) || grid[i][j] != &amp;#39;1&amp;#39; { return } grid[i][j] = &amp;#39;2&amp;#39; dfs(grid, i-1, j) dfs(grid, i, j-1) dfs(grid, i+1, j) dfs(grid, i, j+1) } func numIslands(grid [][]byte) int { res := 0 for i := range grid { for j := range grid[0] { if grid[i][j] == &amp;#39;1&amp;#39; { dfs(grid, i, j) res++ } } } return res }</description></item><item><title>019 建图 拓扑排序</title><link>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-e9fcad8cad1f7070/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-e9fcad8cad1f7070/</guid><description>func findOrder(numCourses int, prerequisites [][]int) []int { // 建图 adj := make([][]int, numCourses) for i := range numCourses { adj[i] = make([]int, 0) } for i := range prerequisites { adj[prerequisites[i][1]] = append(adj[prerequisites[i][1]], prerequisites[i][0]) } // 添加入度 indegree := make([]int, numCourses) for i := range adj { for j := range adj[i] { indegree[adj[i][j]]++ } } // 反复寻找入度为零的点 queue := make([]int, numCourses) l, r := 0, 0 for i := range indegree { if indegree[i] == 0 { queue[r] = i r++ } } for l &amp;lt; r { for i := range adj[queue[l]] { indegree[adj[queue[l]][i]]-- if indegree[adj[queue[l]][i]] == 0 { queue[r] = adj[queue[l]][i] r++ } } l++ } if r !</description></item><item><title>020 最小生成树</title><link>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-1e4b6269dee7ec69/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-1e4b6269dee7ec69/</guid><description>var arr []int const MAXM = 200001 var edges [][3]int = make([][3]int, MAXM) func find(i int) int { if arr[i] != i { arr[i] = find(arr[i]) } return arr[i] } func union(x, y int) { arr[find(x)] = arr[find(y)] } func isSameSet(a, b int) bool { return find(a) == find(b) } func main() { slices.SortFunc(edges, func(a, b [3]int) int { return a[2] - b[2] }) arr = make([]int, n+1) for i := range arr { arr[i] = i } ans := 0 for _, edge := range edges { if !</description></item><item><title>021 BFS</title><link>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-3eac7d23856318f2/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-3eac7d23856318f2/</guid><description/></item><item><title>022 Dijkstra</title><link>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-36f6c95aa6236000/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-36f6c95aa6236000/</guid><description/></item><item><title>023 动态规划</title><link>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-ca62183b6b41fe58/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-ca62183b6b41fe58/</guid><description>53. 最大子数组和 给你一个整数数组 nums ，请你找出一个具有最大和的连续子数组，返回其最大和。 问：为什么不能用「选或不选 nums[i]」的思路做？ 答：选或不选无法保证子数组是连续的。
选或不选适用于子序列问题（例如 0-1 背包问题） 对于子数组问题，更适合用「拼接」的思路，即如果 nums[i] 左边的子数组元素和是负的，就不用和左边的子数组拼在一起了。 300. 最长递增子序列 问：什么样的题目适合「选或不选」，什么样的题目适合「枚举选哪个」？ 答：我分成两类问题：
相邻无关子序列问题（比如 0-1 背包），适合「选或不选」。每个元素互相独立，只需依次考虑每个元素选或不选。 相邻相关子序列问题（比如本题），适合「枚举选哪个」。我们需要知道子序列中的相邻两个数的关系。对于本题来说，枚举 nums[i] 必选，然后枚举前一个必选的数，方便比大小。如果硬要用「选或不选」，需要额外记录上一个选的数的下标，算法总体的空间复杂度为 O(n 2 )，而枚举选哪个只需要 O(n) 的空间。 完全背包
dp[i][j] = min(dp[i-1][j], dp[i][j-coins[i-1]]+1)
func coinChange(coins []int, amount int) int { m, n := len(coins)+1, amount+1 dp := make([][]int, m) for i := range m { dp[i] = make([]int, n) } for j := range n { dp[0][j] = math.MaxInt32 } dp[0][0] = 0 for i := 1; i &amp;lt; m; i++ { for j := 1; j &amp;lt; n; j++ { if coins[i-1] &amp;gt; j { dp[i][j] = dp[i -1][j] } else { dp[i][j] = min(dp[i-1][j], dp[i][j-coins[i-1]]+1) } } } if dp[m-1][n-1] &amp;gt; math.</description></item><item><title>1 二分查找</title><link>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-954ae5c860a521a1/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-954ae5c860a521a1/</guid><description> 找下界：满足 x ≥ target 的第一个元素 # func lowerBound(nums []int, target int) int { left, right := 0, len(nums)-1 // 闭区间 [left, right] for left &amp;lt;= right { // 区间不为空 // 循环不变量： // nums[left-1] &amp;lt; target // nums[right+1] &amp;gt;= target mid := left + (right-left)/2 if nums[mid] &amp;lt; target { left = mid + 1 } else { right = mid - 1 } } return left } 循环条件为 left &amp;lt;= right，表示闭区间不为空 if 的判定条件和给定的比较规则是一致的：比如要找满足 x &amp;gt;= target 的第一个元素，就令 if nums[m] &amp;gt;= target；要找满足 x &amp;gt; target 的第一个元素，就令 if nums[m] &amp;gt; target if 为真时，更新 right：right = mid - 1；否则 left = mid + 1 当循环结束时，left 就指向下界，right 指向「互补条件」的上界 x &amp;gt;= target (lowerBound) x &amp;gt; target &amp;ndash;&amp;gt; (lowerBound(target+1)) x &amp;lt; target &amp;ndash;&amp;gt; (lowerBound(target)-1) x &amp;lt;= target &amp;ndash;&amp;gt; (lowerBound(target+1)-1)</description></item><item><title>10 根据数量猜解法</title><link>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-ab0e8b2c1887a318/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-ab0e8b2c1887a318/</guid><description> n log n n n·log n n·√n n² 2ⁿ n! n ≤ 11 Yes Yes Yes Yes Yes Yes Yes n ≤ 25 Yes Yes Yes Yes Yes Yes No n ≤ 5000 Yes Yes Yes Yes Yes No No n ≤ 10^5 Yes Yes Yes Yes No No No n ≤ 10^6 Yes Yes Yes No No No No n ≤ 10^7 Yes Yes No No No No No n ≥ 10^8 Yes No No No No No No</description></item><item><title>11 字典树</title><link>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-b9665981749c9436/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-b9665981749c9436/</guid><description>快速找前缀
package main const MAXN = 150000 var tree [MAXN][26]int var end [MAXN]int var pass [MAXN]int var cnt int type Trie struct{} func Constructor() Trie { for i := 0; i &amp;lt; MAXN; i++ { for j := range 26{ tree[i][j] = 0 } end[i] = 0 pass[i] = 0 } cnt = 1 return Trie{} } func (this *Trie) Insert(word string) { next := 1 pass[next]++ for _, ch := range word { p := ch - &amp;#39;a&amp;#39; if tree[next][p] == 0 { cnt++ tree[next][p] = cnt } next = tree[next][p] pass[next]++ } end[next]++ } func (this *Trie) Search(word string) bool { next := 1 for _, ch := range word { p := ch - &amp;#39;a&amp;#39; if tree[next][p] == 0 { return false } next = tree[next][p] } return end[next] &amp;gt; 0 } func (this *Trie) StartsWith(prefix string) bool { next := 1 for _, ch := range prefix { p := ch - &amp;#39;a&amp;#39; if tree[next][p] == 0 { return false } next = tree[next][p] } return pass[next] &amp;gt; 0 }</description></item><item><title>2 输入输出</title><link>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-2683c56f9ef2a8db/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-2683c56f9ef2a8db/</guid><description>package main import ( &amp;#34;bufio&amp;#34; &amp;#34;os&amp;#34; &amp;#34;strconv&amp;#34; ) func main() { scanner := bufio.NewScanner(os.Stdin) scanner.Split(bufio.ScanWords) writer := bufio.NewWriter(os.Stdout) defer writer.Flush() scanner.Scan() n, _ := strconv.Atoi(scanner.Text()) arr := make([]int, n) for i := range n { scanner.Scan() arr[i], _ = strconv.Atoi(scanner.Text()) } for i := range n { writer.WriteString(strconv.Itoa(arr[i])) writer.WriteByte(&amp;#39;\n&amp;#39;) } }</description></item><item><title>3-0 排序函数</title><link>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-82a554dd600dd7b9/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-82a554dd600dd7b9/</guid><description>sort.Slice(slice, func(i, j int) bool { return slice[i] &amp;lt; slice[j] }) slices.Sort(nums) slices.SortFunc(intervals,func(i, j []int) int {return p[0]-q[0]})</description></item><item><title>3-1 快排</title><link>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-c66dfe556ffe17ea/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-c66dfe556ffe17ea/</guid><description>func partition(nums []int, l, r int) (int, int) { pivot := nums[l+rand.Intn(r-l+1)] for i := l; i &amp;lt;= r; { if nums[i] &amp;lt; pivot { nums[i], nums[l] = nums[l], nums[i] l++ i++ } else if nums[i] &amp;gt; pivot { nums[i], nums[r] = nums[r], nums[i] r-- } else { i++ } } return l, r } func quickSort(nums []int, l, r int) { if l &amp;gt;= r { return } lt, gt := partition(nums, l, r) quickSort(nums, l, lt-1) quickSort(nums, gt+1, r) } // 手写栈递归 func quickSort(nums []int, l, r int) { stack := [][2]int{{0, len(nums) - 1}} for len(stack) &amp;gt; 0 { top := stack[len(stack)-1] stack = stack[:len(stack)-1] l, r := top[0], top[1] if l &amp;gt;= r { continue } a, b := partition(nums, l, r) stack = append(stack, [2]int{l, a-1}) stack = append(stack, [2]int{b+1, r}) } }</description></item><item><title>3-2 归并</title><link>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-b5a41178d94dac43/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-b5a41178d94dac43/</guid><description>func sortArray(nums []int) []int { mergeNums := make([]int, len(nums)) mergeSort(nums, mergeNums, 0, len(mergeNums)-1) return nums } func mergeSort(nums []int, mergeNums []int, l int, r int) { if l == r { return } middle := (l + r) / 2 mergeSort(nums, mergeNums, l, middle) mergeSort(nums, mergeNums, middle+1, r) merge(nums, mergeNums, l, middle, r) } func merge(nums []int, mergeNums []int, l int, middle int, r int) { i, j := l, middle+1 index := l for i &amp;lt;= middle &amp;amp;&amp;amp; j &amp;lt;= r { if nums[i] &amp;lt; nums[j] { mergeNums[index] = nums[i] i++ } else if nums[i] &amp;gt;= nums[j] { mergeNums[index] = nums[j] j++ } index++ } for i &amp;lt;= middle { mergeNums[index] = nums[i] i++ index++ } for j &amp;lt;= r { mergeNums[index] = nums[j] j++ index++ } for ; l &amp;lt;= r; l++ { nums[l] = mergeNums[l] } } func splitList(head *ListNode) *ListNode { fast, slow := head, head pre := head for fast !</description></item><item><title>4 堆排</title><link>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-90c4b0254739dae3/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-90c4b0254739dae3/</guid><description>import ( &amp;#34;container/heap&amp;#34; &amp;#34;fmt&amp;#34; ) type hp []int func (h hp) Len() int { return len(h) } func (h hp) Less(i, j int) bool { return h[i] &amp;lt; h[j] } func (h hp) Swap(i, j int) { h[i], h[j] = h[j], h[i] } func (h *hp) Push(x any) { *h = append(*h, x.(int)) } func (h *hp) Pop() any { x := (*h)[len(*h)-1]; *h = (*h)[:len(*h)-1]; return x } 函数 描述 时间复杂度 heap.</description></item><item><title>5 位运算</title><link>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-68322f38eb7e7056/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-68322f38eb7e7056/</guid><description>：提取一个数 二进制状态 最右侧的1 (aeorb &amp;amp; -aeorb)</description></item><item><title>6 设计数据结构</title><link>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-cec737291448f34c/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-cec737291448f34c/</guid><description>map：key -&amp;gt; position
数组/链表/二维数组：维护 使用时间，频率，随机读取</description></item><item><title>7 二叉树</title><link>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-6c0a68c1c64c357d/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-6c0a68c1c64c357d/</guid><description> 层序遍历 # type TreeNode struct { Val int Left *TreeNode Right *TreeNode } func rightSideView(root *TreeNode) []int { res := []int{} if root == nil { return res } queue := []*TreeNode{root} for len(queue)!=0 { temp := queue queue = []*TreeNode{} for _,node := range temp{ if node.Left != nil{ queue = append(queue, node.Left) } if node.Right != nil { queue = append(queue, node.Right) } } } return res }</description></item><item><title>8 DFS 回溯</title><link>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-4004bf49b384be56/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-4004bf49b384be56/</guid><description> 嵌套字符串 八皇后 func combinationSum(candidates []int, target int) [][]int { res := [][]int{} path := []int{} var dfs func(candidates []int, index, sum int) dfs = func(candidates []int, index, sum int){ if index == len(candidates) || sum &amp;gt; target { if sum == target{ res = append(res, append([]int{}, path...)) } return } dfs(candidates, index+1, sum) path = append(path, candidates[index]) dfs(candidates, index, sum+candidates[index]) path = path[:len(path)-1] } dfs(candidates, 0,0) return res }</description></item><item><title>9 最大公约数</title><link>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-25ff46551aa2cb56/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-25ff46551aa2cb56/</guid><description>// 求最大公约数 func gcd(a, b int) int { if b == 0 { return a } return gcd(b, a%b) } func lcm(a, b int) int { return a / gcd(a, b) * b }</description></item><item><title>建树</title><link>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-99680b6620ef51d8/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-e3f7616b19908d30/n-99680b6620ef51d8/</guid><description> 给边，但并不知道谁是谁是父节点 # 直接建图，在遍历时传参带父节点，避免循环
func minimumFuelCost(roads [][]int) int64 { n := len(roads) + 1 graph := make([][]int, n) for i := range graph { graph[i] = make([]int, 0) } for _, road := range roads { graph[road[0]] = append(graph[road[0]], road[1]) graph[road[1]] = append(graph[road[1]], road[0]) } _, cost := dfs(graph, 0, -1) return int64(cost) } 给父节点数组parent[i] 是节点 i 的父节点 # func longestPath(parent []int, s string) int { n := len(parent) graph := make([][]int, n) for i := range graph { graph[i] = make([]int, 0) } for i := 1; i &amp;lt; n; i++ { graph[parent[i]] = append(graph[parent[i]], i) } dfs(graph, []byte(s)) }</description></item></channel></rss>