旋转排序数组查找目标值1返回-1,请求代码错误排查帮助
问题根源:峰值查找逻辑适配错误
你的代码核心问题出在peak_ele函数——它的逻辑是为山峰数组(先升后降,中间有唯一峰值)设计的,但你的数组是旋转排序数组(由两个升序子数组拼接而成,左半段所有元素大于右半段),导致它错误地返回了数组最后一个元素的索引(7),而非正确的峰值索引(4,对应元素7)。
错误流程拆解
- 错误的峰值索引导致第一次二分查找范围是
0-7,整个数组并非升序,二分查找无法正确定位目标值1,返回-1。 - 第二次二分查找的范围是
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
相关产品推荐
相关产品推荐

