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
相关产品推荐
相关产品推荐

