LeetCode多数元素问题代码错误排查:输入[3,3,4]返回4而非3
多数元素问题代码错误排查与修复
你的代码在处理输入[3,3,4]时返回4而非预期的3,核心问题出在countInRange函数的逻辑错误:
countInRange的设计目标是统计指定范围内目标数字num的出现次数,但当前代码的判断逻辑完全错误:循环内你判断的是si == ei(即当前范围是否仅包含单个元素),而非判断遍历到的元素nums[i]是否等于目标num。- 这会导致统计结果完全失真:当范围长度大于1时,
si != ei,循环内的计数条件永远不触发,返回0;只有当范围长度为1时,才会返回1。
以输入[3,3,4]为例,执行流程的错误点:
- 递归拆分后,左半部分返回3,右半部分返回4;
- 调用
countInRange统计3的次数时,范围是0-2(si≠ei),返回0; - 统计4的次数时,同样范围0-2,返回0;
- 此时
leftCount与rightCount相等,三元运算符返回后者4,最终结果错误。
修复后的代码
class Solution { // 修复后的countInRange函数 public static int countInRange(int nums[], int num, int si, int ei) { int count = 0; for(int i = si; i <= ei; i++) { // 正确判断当前元素是否等于目标num if(nums[i] == num) { count++; } } return count; } private static int majorityElementRec(int nums[], int si, int ei) { if(si == ei) { return nums[si]; } int mid = si + (ei - si)/2; int left = majorityElementRec(nums, si, mid); int right = majorityElementRec(nums, mid+1, ei); if(left == right) { return left; } int leftCount = countInRange(nums, left, si, ei); int rightCount = countInRange(nums, right, si, ei); return leftCount > rightCount ? left : right; } public int majorityElement(int[] nums) { return majorityElementRec(nums, 0, nums.length-1); } }
内容的提问来源于stack exchange,提问作者Gulshan Kumar
相关产品推荐
相关产品推荐

