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

LeetCode旋转排序数组搜索C++代码在长度为2的数组上报错求助

解决《搜索旋转排序数组》中长度为2的数组报错问题

你的代码在处理长度为2的数组时出现报错,核心问题是条件判断的顺序错误,导致数组越界访问。

错误原因分析

  • 在findpiv函数的第一个判断条件中,你将nums[mid-1] > nums[mid]放在了mid>l前面。C++的逻辑与(&&)是短路求值,但如果先执行nums[mid-1],当mid <= l时(比如数组长度为2,l=0, h=1,mid=0),mid-1=-1,这会直接访问数组的非法索引,触发越界错误。
  • 同理,第二个判断条件nums[mid] > nums[mid+1] && mid<h,如果mid >= h,先访问nums[mid+1]也会导致越界。

修正后的代码

调整条件判断顺序,确保先验证索引合法性,再访问数组元素;同时修正search函数的区间划分细节:

class Solution {
private: 
    int findpiv (vector<int>& nums, int l, int h) {
        if (l > h) {
            return -1;
        }
        if (l == h) {
            return l;
        }
        int mid = (l + h) / 2;

        // 先判断索引合法性,再访问数组
        if (mid > l && nums[mid-1] > nums[mid]) {
            return mid-1;
        }
        if (mid < h && nums[mid] > nums[mid+1]) {
            return mid;
        }
        if (nums[l] > nums[mid]) {
            return findpiv(nums, l, mid-1);
        }
        return findpiv(nums, mid+1, h);
    }

    int bsearch (vector<int>& nums, int target, int l, int h) {
        if (l > h) {
            return -1;
        }
        int mid = (l + h) / 2;
        if (nums[mid] == target) {
            return mid;
        }
        if (nums[mid] > target) {
            return bsearch(nums, target, l, mid-1);
        }
        return bsearch(nums, target, mid+1, h);
    }
public:
    int search(vector<int>& nums, int target) {
        int piv = findpiv(nums, 0, nums.size()-1);
        if (piv == -1) {
            return bsearch(nums, target, 0, nums.size()-1);
        }
        if (target == nums[piv]) {
            return piv;
        }
        if (target >= nums[0]) {
            return bsearch(nums, target, 0, piv);
        }
        // 目标值在pivot右侧区间,从piv+1开始搜索
        return bsearch(nums, target, piv+1, nums.size()-1);
    }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:42:47