此代码用于查找具有整数的数组的峰值数
问题是我收到错误Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 7
。
public long DivideAndConquer(int lo,int hi)
{
int mid=((lo+hi)-1)/2;
if(myarray[mid]>=myarray[mid-1]&&myarray[mid]>= myarray[mid+1])
return myarray[mid];
else if (myarray[mid-1]>= myarray[mid])
return DivideAndConquer(lo,mid-1);
else if (myarray[mid]<=myarray[mid+1])
return DivideAndConquer(mid+1,hi);
return 99;
}
峰值数字是一个比它们的邻居更大的数字,如果我在数组的末尾或者在开头,那么我必须只查看预览元素。
我想我得到了这个错误,因为如果我的元素在最后位置比预览大,那么就是一个峰值。例如我的最后一个位置是9然后我有myarray[9] > myarray[8]
然后是一个峰值,但在第一个if语句中它也看起来myarray[9+1]
我没有它所以它给了我这个错误。
我无法删除第一个语句的&&
并添加“或”(||
),因为我得到了错误的答案。有什么想法吗?
答案 0 :(得分:1)
就像你说的那样,问题是当mid + 1
是数组中的最后一项时,你的实现会尝试查看索引mid
。你需要处理这个案子。如下所示:
public long DivideAndConquer(int lo,int hi){
int mid = (lo+hi) / 2; //Modified to select the middle item
if(mid + 1 >= myarray.length){
//TODO: Handle the case when mid is the index of the last item in the array
} else if(mid - 1 < 0){
//TODO: Handle the case when mid is the index of the first item in the array
} else if(myarray[mid]>=myarray[mid-1]&&myarray[mid]>= myarray[mid+1]){
return myarray[mid];
} else if (myarray[mid-1]>= myarray[mid]){
return DivideAndConquer(lo,mid-1);
} else if (myarray[mid]<=myarray[mid+1]){
return DivideAndConquer(mid+1,hi);'
}
return Long.MIN_VALUE; //Probably a more suitable error indicator than 99
//Alternatively, an exception could be thrown
}
如果您使用上面建议的方法,在实施mid - 1 < 0
和mid + 1 >= myarray.length
个案的处理时要特别小心。 myarray.length
仅1
或2
时,您可能需要对案例进行一些特殊处理。
答案 1 :(得分:0)
不考虑算法的正确性,我进行了以下安全索引更改:
public long DivideAndConquer(int lo,int hi)
{
int mid=(lo+hi)/2; // Valid range
if((lo<mid||myarray[mid]>=myarray[mid-1])
&&(hi>mid||myarray[mid]>= myarray[mid+1]))
return myarray[mid];
else if (lo<mid&&yarray[mid-1]>= myarray[mid])
return DivideAndConquer(lo,mid-1);
else if (hi>mid&&myarray[mid]<=myarray[mid+1])
return DivideAndConquer(mid+1,hi);
return 99;
}
答案 2 :(得分:0)
当你在&#34; if-else-if - &#34; ...构建中实施这样的决定级联时,必须确保每个案例都得到处理。
此外,您必须确保任何计算的数组索引对给定数组有效。这个要求可能会引入更多&#34; if&#34;语句。
在你的文字中,你写了#34;如果我在数组的末尾或开头的#34;,但在你的代码中没有&#34; if-statements&#34;检查这些条件。