呼啦烫 2024-06-14 09:26 采纳率: 100%
浏览 1
已结题

天哪!我发现了二分查找的BUG!

求问,本题是二分查找的算法,涉及的知识点是查找最左侧和查找最右侧的数据。
我用纸笔演算过,演算的结果没有问题。但是在力扣上结果报错,看意思是超出了范围。
所以有人可以告诉我出现什么问题了?超级感谢~


class Solution {
    public int[] searchRange(int[] nums, int target) {
        int x = left(nums, target);
        if (x == -1) {
            return new int[] { -1, -1 };
        } else {
            return new int[] { x, right(nums, target) };
        }
    }

    public int left(int[] a, int target) {
        int i = 0, j = a.length - 1;
        while (i <= j) {
            int m = (i + j) >>> 1;
            if (target <= a[m]) {
                j = m - 1;
            } else {
                i = m + 1;
            }
        }
        if (target == a[i]) {
            return i;
        } else {
            return -1;
        }
    }

    public int right(int[] a, int target) {
        int i = 0, j = a.length - 1;
        while (i <= j) {
            int m = (i + j) >>> 1;
            if (target < a[m]) {
                j = m - 1;
            } else {
                i = m + 1;
            }
        }
        if (target == a[i - 1] && i >= 0) {
            return i - 1;
        } else {
            return -1;
        }
    }
}

题目:
34. 在排序数组中查找元素的第一个和最后一个位置
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/?envType=study-plan-v2&envId=binary-search
结果:

java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
  at line 21, Solution.left
  at line 3, Solution.searchRange
  at line 56, __DriverSolution__.__helper__
  at line 89, __Driver__.main

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-14 09:26
    关注

    引自免费微信小程序:皆我百晓生

    你的二分查找实现基本正确,但在处理边界情况时存在一些问题。主要问题在于当输入数组为空(nums.length == 0)时,你的代码会尝试访问数组的第0个元素,导致ArrayIndexOutOfBoundsException异常。此外,在查找左侧边界时,如果目标值位于数组末尾,left()方法可能会越界。同样地,在查找右侧边界时,如果目标值位于数组开头,right()方法也可能出现不正确的判断。

    解决方案:

    1. 检查数组是否为空:在searchRange()方法中首先检查数组长度,如果为0,则直接返回[-1, -1]
    2. 调整边界条件:在left()right()方法中,确保不会发生数组索引越界的情况。

    修改后的代码:

    class Solution {
        public int[] searchRange(int[] nums, int target) {
            // 检查数组是否为空
            if (nums.length == 0) {
                return new int[] { -1, -1 };
            }
            
            int leftPos = left(nums, target);
            if (leftPos == -1) {
                return new int[] { -1, -1 };
            } else {
                return new int[] { leftPos, right(nums, target) };
            }
        }
    
        public int left(int[] a, int target) {
            int i = 0, j = a.length - 1;
            while (i <= j) {
                int m = (i + j) >>> 1;
                if (target <= a[m]) {
                    j = m - 1;
                } else {
                    i = m + 1;
                }
            }
            // 确保索引不越界,并且找到的目标值与所求相符
            if (i < a.length && target == a[i]) {
                return i;
            } else {
                return -1;
            }
        }
    
        public int right(int[] a, int target) {
            int i = 0, j = a.length - 1;
            while (i <= j) {
                int m = (i + j) >>> 1;
                if (target < a[m]) {
                    j = m - 1;
                } else {
                    i = m + 1;
                }
            }
            // 确保索引不越界,并且找到的目标值与所求相符
            if (j >= 0 && target == a[j]) {
                return j;
            } else {
                return -1;
            }
        }
    }
    

    这样修改后,代码能够更安全地处理所有边界情况,包括空数组以及目标值位于数组边界的情况。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月22日
  • 已采纳回答 6月14日
  • 创建了问题 6月14日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?