二分查找为啥越界了咋改


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

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


    } 

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


    } 

}
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7528670
  • 你也可以参考下这篇文章:二分查找实用模板
  • 您还可以看一下 刘磊老师的计算机进制转换课程中的 二进制整数转为十进制数小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    二分查找是一种常见的查找算法,主要用于在有序数组中查找特定元素。但是在实现二分查找时,有时会出现越界的情况,即数组的索引值超出数组的边界。针对越界的情况,可以进行如下修改来修复二分查找算法:

    1. 在实现二分查找的过程中,需要先判断边界条件。如果目标值小于数组的第一个元素或大于数组的最后一个元素,则直接返回越界错误。

    2. 在每次迭代过程中,需要对数组的中间元素进行边界判断,如果中间元素超出了数组的边界,则直接返回越界错误。在判断边界时,可以使用以下条件:

    3. 当前中间元素索引小于0或大于等于数组长度时,表示越界。

    下面是针对越界问题进行修复的二分查找代码示例:

    public class BinarySearch {
        public static int binarySearch(int[] nums, int target) {
            int left = 0;
            int right = nums.length - 1;
    
            while (left <= right) {
                int mid = left + (right - left) / 2;
    
                if (nums[mid] == target) {
                    return mid;
                } else if (nums[mid] < target) {
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }
    
                // 判断边界条件
                if (mid < 0 || mid >= nums.length) {
                    return -1; // 返回越界错误
                }
            }
    
            return -1; // 未找到目标元素
        }
    
        public static void main(String[] args) {
            int[] nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
            int target = 7;
    
            int index = binarySearch(nums, target);
    
            System.out.println("Target found at index: " + index);
        }
    }
    

    以上代码对边界情况进行了判断,如果出现越界,直接返回错误结果。这样可以避免在查找过程中出现越界问题。

    如果以上代码不能解决你的问题,请告诉我具体的错误信息,我将尽力帮助你解决。