You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

旋转排序数组查找目标值1返回-1,请求代码错误排查帮助

问题根源:峰值查找逻辑适配错误

你的代码核心问题出在peak_ele函数——它的逻辑是为山峰数组(先升后降,中间有唯一峰值)设计的,但你的数组是旋转排序数组(由两个升序子数组拼接而成,左半段所有元素大于右半段),导致它错误地返回了数组最后一个元素的索引(7),而非正确的峰值索引(4,对应元素7)。

错误流程拆解

  1. 错误的峰值索引导致第一次二分查找范围是0-7,整个数组并非升序,二分查找无法正确定位目标值1,返回-1。
  2. 第二次二分查找的范围是8-7,此时start > end,循环直接跳过,返回-1。最终结果自然是-1。

修正方案

重新实现peak_ele函数,适配旋转排序数组的特性:我们需要找到数组中最大元素的索引(旋转点),可以通过比较中间元素与右端点元素的大小来判断哪一段是有序的,从而缩小范围。

修正后的完整代码:

public class searchInRotatedSortedArray {

    public static void main(String[] args) {
        int[] arr = {3,4,5,6,7,0,1,2};
        int target = 1;
       
        int peak = peak_ele(arr);
        int ans = bs(arr, target, 0, peak);
        if (ans == -1) {
            ans = bs(arr, target, peak+1, arr.length-1);
        }
        System.out.println(ans); // 输出6,符合预期
    }
    
    static int peak_ele(int[] arr){
        int start = 0;
        int end = arr.length - 1;
        // 处理数组未旋转的情况
        if (arr[start] < arr[end]) {
            return end;
        }
        while (start < end) {
            int mid = start + (end - start) / 2;
            // 如果中间元素大于右端元素,说明峰值在右半段(含mid)
            if (arr[mid] > arr[end]) {
                start = mid;
            } else {
                // 否则峰值在左半段(不含mid)
                end = mid - 1;
            }
        }
        return start;
    }

    static int bs(int[] arr, int target, int start, int end) {
        while (start <= end) {
            int mid = start + (end - start) / 2;
            if (arr[mid] == target) {
                return mid;
            }
            if (arr[mid] < target) {
                start = mid + 1;
            } else {
                end = mid - 1;
            }
        }
        return -1;
    }
}

修正逻辑说明

  • peak_ele函数中,通过比较arr[mid]和arr[end]:
    • 若arr[mid] > arr[end],说明右半段是无序的,峰值在mid到end之间,调整start=mid。
    • 若arr[mid] <= arr[end],说明右半段是有序的,峰值在start到mid-1之间,调整end=mid-1。
  • 增加了数组未旋转的判断,确保边界情况正常处理。

内容的提问来源于stack exchange,提问作者koyal kondapalli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 21:54:57