旋转排序数组搜索Java代码bug排查:目标值7匹配失败
旋转数组查找问题调试
问题背景
给定一个经旋转的升序整数数组(元素互不相同),要求在O(log n)时间内查找目标值的索引,不存在则返回-1。
代码错误定位
你的代码核心错误在于搜索区间的左边界初始化错误:
- 错误代码行:
int left = nums[0]; - 正确逻辑:
left应该表示搜索区间的左索引,初始值应为0,而非数组第一个元素的值。
测试用例错误分析
针对测试用例nums = [6,7,1,2,3,4,5]、target =7:
- 错误初始化后,
left =6(数组第一个元素的值),right=6(数组最后一个索引) - 第一次循环
mid=(6+6)/2=6,nums[6]=5≠7 - 判断
nums[left](nums[6]=5)<= nums[mid](5)成立,进入左半部分逻辑 - 检查
5<=7<5不成立,执行left=mid+1=7,此时left>right,循环终止返回-1,与预期结果不符。
修正后的代码
class Solution { public int search(int[] nums, int target) { int left = 0; // 修正为左索引初始值0 int right = nums.length - 1; while (left <= right) { int mid = (left + right) / 2; if (target == nums[mid]) { return mid; } else { // 左半部分有序 if (nums[left] <= nums[mid]) { if (nums[left] <= target && target < nums[mid]) { right = mid - 1; } else { left = mid + 1; } } else { // 右半部分有序 if (nums[mid] < target && target <= nums[right]) { left = mid + 1; } else { right = mid - 1; } } } } return -1; } }
修正后测试验证
- 初始
left=0,right=6,mid=3,nums[3]=2≠7 - 判断
nums[0]=6 <= nums[3]=2不成立,进入右半部分逻辑 - 检查
2<7<=5不成立,执行right=mid-1=2 - 新循环
left=0,right=2,mid=1,nums[1]=7匹配目标值,返回索引1,符合预期。
内容的提问来源于stack exchange,提问作者nik
相关产品推荐
相关产品推荐

