区间调度贪心法必须按结束时间升序排序,因数学上可证选结束最早的能为后续留最多空间;错用起始时间或降序会导致结果错误;判断兼容需用≥而非>以包含端点相接情况。

按结束时间升序排序是区间调度的铁律
几乎所有区间类贪心题(如 eraseOverlapIntervals、nonOverlappingIntervals)都依赖这个排序规则。不是“习惯”,而是数学可证:选结束最早的,给后续留出最多空间。用错字段(比如按 start 排)或方向(降序)会导致结果偏小甚至 panic。
- 正确写法:
sort.Slice(intervals, func(i, j int) bool { return intervals[i][1] - 结构体更安全:
sort.Slice(acts, func(i, j int) bool { return acts[i].End - 别在比较函数里做越界访问——
intervals[i]和intervals[j]必须保证索引合法,否则 panic 不报具体行号,难定位
遍历中更新基准值必须从第一个有效元素开始
常见错误是设 lastEnd = -1 然后直接进循环,结果 [0, 0] 这种区间被跳过(因为 0 >= -1 成立但逻辑上不该算“兼容”)。Go 没有默认哨兵值,得尊重输入本身。
在 Golang 中使用 samber/hot 进行内存缓存,支持 LRU、LFU、TinyLFU、W‑TinyLFU、S3FIFO、ARC、TwoQueue、SIEVE、FIFO 等淘汰算法,提供 TTL、缓存加载器及分片功能。
- 空切片先判:
if len(intervals) == 0 { return 0 } - 单元素直接返回 1,别进循环
- 初值取
lastEnd = intervals[0][1],计数器count = 1,然后从i = 1开始扫 - 判断条件严格用
intervals[i][0] >= lastEnd(闭区间允许端点相接),写成>会漏掉[1,2]和[2,3]这类合法组合
贪心不等于无脑选最大/最小,得看问题约束反推排序依据
看到“分发”“安排”“合并”就下意识排序,容易翻车。比如 findContentChildren 要孩子胃口和饼干尺寸都升序;queueReconstructionByHeight 却要身高降序 + k 值升序;lastStoneWeight 需最大堆而非简单排序——每次取最大两个,sort.Ints 后取末尾是 O(n²log n),实际应手写 heap.Interface。
- 双关键字排序务必写全逻辑:
people[i][0] > people[j][0] || (people[i][0] == people[j][0] && people[i][1] - 浮点比较慎用:
value/weight类场景用float64,但避免用它存时间戳或索引 - 硬币找零(
coinChange)用贪心仅当面额满足「正则性」(如 [1,5,10,25]),否则反例一堆,必须换 DP
边界和类型细节比算法逻辑更容易崩程序
贪心主干往往就 10 行,但崩点全在周边:空输入、负数区间、整数溢出、结构体字段名拼错、sort.Slice 闭包里漏写 return。这些不会报“贪心错了”,只会报 index out of range 或静默错结果。
- 所有输入切片操作前加
if len(x) == 0防崩 - 时间/索引类字段统一用
int,别混int64或float64,排序和比较时精度丢失不可逆 -
sort.Slice的比较函数必须有确定返回值,不能只写if a 而漏掉 else 分支,否则行为未定义 - 结果要返回具体区间而非仅数量时,预分配
result := make([]Interval, 0, len(intervals)),避免反复扩容
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










