go中贪心算法需手动实现,核心在于正确定义“当前最优”并依题干约束设计排序规则;常见错误包括排序不稳定、边界处理不当及忽略剩余操作处理。

Go 里没有 greedy 函数,所有贪心逻辑都得你亲手写;能不能对,不看代码多短,而取决于「当前最优」的定义是否贴合问题本质。
排序规则必须从题干约束反推,不是凭感觉选升序或降序
贪心在 Go 中几乎离不开 sort.Slice,但错一个比较条件,结果就全错。比如:
-
eraseOverlapIntervals:必须按intervals[i][1](结束时间)升序——让最早结束的区间优先被选,给后面留最多空间 -
findContentChildren:孩子胃口g和饼干尺寸s都要升序——最小饼干喂最小胃口,避免浪费大饼干 -
reconstructQueue:先按身高people[i][0]降序,再按k值升序——高个子先站,他们看不到矮个子;同身高时,k小的往前插
常见错误:sort.Ints 直接排二维切片(只排第一维);Less 函数里漏掉相等情况(如 == 时不返回 false),导致排序不稳定;用 float64 存整数区间端点,精度丢失引发比较失效。
遍历时的边界判断比主逻辑更易出错
贪心通常是单次遍历,但起始、终止、重叠判定稍有偏差就会漏解或多算:
- 空输入必须提前检查:
if len(intervals) == 0 { return 0 },别指望循环兜住 - 单元素输入容易被忽略:比如只有一段区间,是否算作 1 个有效活动?要看题意,但代码里不能跳过初始化
- 区间重叠判断别硬套公式:
[a,b]和[c,d]是闭区间,不重叠条件是b 或 <code>d ;若写成 <code>b > c判重叠,会把[1,2]和[2,3]错判为重叠(实际合法紧邻) - 更新基准值(如
lastEnd)别用math.MaxInt64初始化——当所有区间都是负数时,第一次比较永远失败;应从第一个元素取值,或用math.MinInt64+ 标记位
贪心策略 ≠ 贪心结果,k 次操作类题最常漏掉剩余处理
像「K 次取反后最大化数组和」「最多加 k 次使 m 个数按位与最大」这类题,策略只是起点:
- 策略是「优先翻绝对值最大的负数」,但若
k还剩且全为正数,得看k是奇数还是偶数:偶数可抵消,奇数则必须翻一次最小正数(或零) - 按位与构造题中,高位尝试设为 1 后,要算每个数达到该目标需最少加几次;取最小的
m个求和,再判断总和 ≤k——漏掉这个验证,就等于没做贪心 - 误把「排序一次 + 扫一遍」当成完成,忽略了操作次数分配的动态性;贪心在这里是逐位决策,每轮都要重新评估可行性
真正卡人的地方从来不是「怎么写 for 循环」,而是「为什么这一位能设 1」「为什么这个排序维度不可替换」「为什么空切片要单独 return」——这些细节藏在题干约束里,不在模板里。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











