为什么我的 mid-1 方法在这个二分搜索问题中不起作用?
Why my mid-1 approach is not working in this binary-search question?
我使用 mid+1 方法解决了这个问题,它很容易解决,但是当我想解决同样的问题时,我将比较形式 mid+1 更改为 mid-1 它不起作用,你能帮我解决一下吗我错了吗?
问题Link
我的初始方法(中+1):
class Solution {
public int peakIndexInMountainArray(int[] arr) {
int start=0;
int end=arr.length-1;
while(start<=end){
int mid=start-(start-end)/2;
if(arr[mid]<arr[mid+1]){
start=mid+1;
}
else {
end=mid-1;
}
}
return start;
}
}
第二种方法(中间 1 方法的错误答案)
class Solution {
public int peakIndexInMountainArray(int[] arr) {
int start=0;
int end=arr.length-1;
while(start<=end){
int mid=start-(start-end)/2;
if(arr[mid-1]<arr[mid]){
start=mid+1;
}
else {
end=mid-1;
}
}
return end;
}
}
您应该将起始值设置为 1:int start=0;
因为如果您要搜索的值位于列表的第一个位置(例如列表:10、6、5、2、1),您现在可以将中间值设为 0,因此峰值是第一个元素列表的一部分,当您尝试访问 arr[mid-1] 时,您会收到 ArrayIndexOutOfBoundsException。
我使用 mid+1 方法解决了这个问题,它很容易解决,但是当我想解决同样的问题时,我将比较形式 mid+1 更改为 mid-1 它不起作用,你能帮我解决一下吗我错了吗?
问题Link
我的初始方法(中+1):
class Solution {
public int peakIndexInMountainArray(int[] arr) {
int start=0;
int end=arr.length-1;
while(start<=end){
int mid=start-(start-end)/2;
if(arr[mid]<arr[mid+1]){
start=mid+1;
}
else {
end=mid-1;
}
}
return start;
}
}
第二种方法(中间 1 方法的错误答案)
class Solution {
public int peakIndexInMountainArray(int[] arr) {
int start=0;
int end=arr.length-1;
while(start<=end){
int mid=start-(start-end)/2;
if(arr[mid-1]<arr[mid]){
start=mid+1;
}
else {
end=mid-1;
}
}
return end;
}
}
您应该将起始值设置为 1:int start=0;
因为如果您要搜索的值位于列表的第一个位置(例如列表:10、6、5、2、1),您现在可以将中间值设为 0,因此峰值是第一个元素列表的一部分,当您尝试访问 arr[mid-1] 时,您会收到 ArrayIndexOutOfBoundsException。