boyer-moore投票法需初始化count=0以表示无候选者,确保首次count==0时才赋值candidate;循环中必须先判count==0再比对相等,否则count可能为负;题目保证多数元素存在时可省略验证,否则须二次统计频次确认。

直接用 Boyer-Moore 投票法,两变量一次遍历就能出结果,前提是题目保证多数元素存在(即出现次数严格 > n/2);否则必须加二次验证。
为什么初始化 count 要为 0,而不是 1?
因为初始时没有可信候选者,count = 0 是“无主状态”的明确信号。若设 count = 1 并强制 candidate = nums[0],会在空数组或首元素非众数时引入错误前提——比如 nums = [1, 2, 2],按 count=1 初始化会跳过首轮校准逻辑,导致后续抵消失准。
正确做法是:遍历中首次遇到 count == 0 时才赋值 candidate,确保每次候选都是从“清零后重新开始”的上下文中产生的。
for 循环里判断顺序不能颠倒
必须先检查 count == 0,再比对 nums[i] == candidate。否则当 count 为 0 时,若先执行 else 分支(即 count--),会导致 count 变成 -1,破坏算法的非负计数语义。
典型错误写法:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
if (nums[i] == candidate) count++; else count--;
这漏掉了 count == 0 时重置 candidate 的关键步骤。正确结构应为:
- 先
if (count == 0) candidate = nums[i]; - 再
if (nums[i] == candidate) count++; else count--;
题目不保证众数存在时,必须二次验证
LeetCode 169 明确说“给定数组总是存在多数元素”,所以省略验证可接受;但实际工程中,输入不可信,仅靠投票结果返回 candidate 是危险的。
验证只需再扫一遍统计频次:
int verify = 0; for (int x : nums) if (x == candidate) verify++; if (verify <p>注意:<code>verify 才算失败——因为题目要求“超过一半”,即严格大于 <code>n/2</code>,整数除法下 <code>n/2</code> 是向下取整,所以用 <code> 判断不满足条件。</code></code></p> <p>最容易被忽略的是:算法本身不检查数组是否为空。C++ 中若传入空 <code>vector</code>,<code>nums[0]</code> 未定义,直接访问会 UB。哪怕题目说“非空”,调用方传错数据时,程序就崩了——生产代码里,第一行该是 <code>if (nums.empty()) throw ...</code>。</p>
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










