我该如何解决这种递归问题

时间:2013-05-03 10:48:07

标签: java algorithm

此代码用于查找具有整数的数组的峰值数 问题是我收到错误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]我没有它所以它给了我这个错误。

我无法删除第一个语句的&&并添加“或”(||),因为我得到了错误的答案。有什么想法吗?

3 个答案:

答案 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 < 0mid + 1 >= myarray.length个案的处理时要特别小心。 myarray.length12时,您可能需要对案例进行一些特殊处理。

答案 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;检查这些条件。

相关问题