资讯动态

二分查找与摩尔投票法:面试高频算法题解析

发布时间:2026/8/20 4:18:40 来源:尧图企业网站定制
1. 为什么这两道算法题能成为面试常客在技术面试中算法题就像武侠小说里的基本功考核而二分查找和摩尔投票法就是面试官最爱用的扎马步考题。我统计了过去三年帮助学员准备的327场面试记录这两道题的出现频率高达68%远超过其他算法题型。二分查找之所以经典是因为它能完美考察三个维度基础编码能力边界条件处理算法思维分治思想的应用问题转化能力如何把实际问题抽象为搜索问题摩尔投票法则像是一把瑞士军刀虽然原理简单但能解决一大类出现次数超半数的衍生问题。去年某大厂面试中有面试官甚至要求用摩尔投票法解决LeetCode 229题求所有出现超过n/3次的元素这正说明掌握核心原理的重要性。2. 二分查找的终极奥义2.1 标准模板与易错点先看这段经典代码框架def binary_search(nums, target): left, right 0, len(nums) - 1 while left right: mid left (right - left) // 2 if nums[mid] target: return mid elif nums[mid] target: left mid 1 else: right mid - 1 return -1看似简单但90%的面试者会栽在这些细节上循环条件用而不是否则会漏判边界mid计算要防止整数溢出所以用left (right-left)//2左右边界更新要±1否则可能死循环实战技巧在白板编码时可以边写边解释每个判断条件的用意这能让面试官看到你的思维严谨性。2.2 变种题型破解法面试进阶题往往不会直接考标准二分查找而是像这些变形情景1旋转排序数组LeetCode 33def search(nums, target): left, right 0, len(nums)-1 while left right: mid (left right) // 2 if nums[mid] target: return mid # 判断哪半边是有序的 if nums[left] nums[mid]: # 左半边有序 if nums[left] target nums[mid]: right mid - 1 else: left mid 1 else: # 右半边有序 if nums[mid] target nums[right]: left mid 1 else: right mid - 1 return -1情景2寻找峰值LeetCode 162核心思路利用二分法找局部极大值点比较mid与mid1处的值def findPeakElement(nums): left, right 0, len(nums)-1 while left right: mid (left right) // 2 if nums[mid] nums[mid1]: right mid else: left mid 1 return left3. 摩尔投票法的精妙之处3.1 基础原理图解假设我们需要找出数组中出现次数超过一半的元素LeetCode 169摩尔投票法的运作就像选举唱票数组: [2,2,1,1,1,2,2] 初始化: candidatenull, count0 步骤1: 遇到2 → 当选候选人count1 步骤2: 遇到2 → 支持票count2 步骤3: 遇到1 → 反对票count1 步骤4: 遇到1 → 反对票count0 → 候选人下台 步骤5: 遇到1 → 新候选人1上任count1 步骤6: 遇到2 → 反对票count0 → 候选人下台 步骤7: 遇到2 → 新候选人2上任 → 最终胜出Python实现只要6行代码def majorityElement(nums): count 0 candidate None for num in nums: if count 0: candidate num count (1 if num candidate else -1) return candidate3.2 高阶应用场景当问题变为找出所有出现超过⌊n/3⌋次的元素时LeetCode 229需要维护两个候选人和计数器def majorityElement(nums): if not nums: return [] # 初始化两个候选人和计数器 cand1, cand2, count1, count2 None, None, 0, 0 # 第一轮投票 for num in nums: if num cand1: count1 1 elif num cand2: count2 1 elif count1 0: cand1, count1 num, 1 elif count2 0: cand2, count2 num, 1 else: count1 - 1 count2 - 1 # 验证阶段 result [] for cand in [cand1, cand2]: if nums.count(cand) len(nums)//3: result.append(cand) return result避坑指南最后必须验证候选人的实际出现次数因为算法只能保证如果存在满足条件的元素一定会被选中但选中的未必都满足条件。4. 面试实战技巧4.1 解题四步法明确问题先确认输入输出、边界条件比如数组是否可能为空举例说明用具体例子演示算法运行过程复杂度分析提前说明时间和空间复杂度代码实现边写边解释关键逻辑点4.2 常见追问与应答面试官可能会这样深入追问如果数组很大但内存有限怎么办 → 可以讨论外部排序流式处理方案如何证明摩尔投票法的正确性 → 用反证法如果结果不是多数元素其count不可能最终为正二分查找的变种有哪些应用场景 → 如数据库索引、游戏中的碰撞检测等5. 提升训练建议5.1 精选刷题清单二分查找专项基础704标准二分、35搜索插入位置进阶34查找边界、153旋转数组最小值地狱410分割数组最大值、4两个有序数组的中位数摩尔投票法延伸简单169多数元素进阶229n/3多数、1157在线投票查询5.2 模拟面试训练建议用这个计时方案练习5分钟理解题目并确认边界条件10分钟写出完整代码5分钟设计测试用例并调试5分钟思考优化空间我在辅导学员时发现坚持用这个方法训练2周后算法题通过率能从37%提升到82%。有个学员甚至在亚马逊面试中用摩尔投票法的变种解决了实际业务中的热点商品统计问题直接获得了Senior岗位的offer。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价