具有分而治之的数组中的最大值

时间:2016-06-15 08:44:16

标签: java arrays algorithm

前提是这是作业,我不知道为什么我不能使用标签'家庭作业'所以为了清楚起见,我会在这里写下来。

我必须写一个方法" int maximum(int [] a,int l,int r)"找到数组A中的最大值,从' l'到了' r'使用分而治之的方法。 基础案例将是A内部有一个元素,因此如果A.length == 1,则返回元素。递归部分应该将数组分成两个子阵列,从A [1]到A [mid],从A [mid + 1]到A [r]。理论上我很好,但我一直得到一个StackOverflowError,我不明白为什么。

public class Maximum {
public static void main(String[] args) {
    int[] A = {0, 5, 281, 3, 9, 4, 88, 16, 17, 60};
    int l = 0;
    int r = A.length-1;
    System.out.println("Maximum of the array: "+maxArray(A, l, r));
}
public static int maxArray(int[] A, int l, int r) {

    //Assuming that the index of array is '0' and not '1', l is 0. Else, put 1.

    if (A.length == 1) {
        return A[l];
    }

    int mid = r/2;
    int maxLeft = 0;
    int maxRight = 0;

    maxLeft = maxArray(A, l, mid);        //Here is the StackOverflowError!
    maxRight = maxArray(A, mid+1, r);

    if (maxLeft < maxRight) {
        return maxRight;
    } else 
return maxLeft;
}
}

2 个答案:

答案 0 :(得分:10)

您在计算mid时遇到问题。

应该是

int mid = (l+r)/2;

除此之外,

if (A.length == 1) {
    return A[l];
}

应该是

if (l == r) {
    return A[l];
}

因为你总是将原始数组传递给你的方法,所以如果原始数组只有一个元素,A.length只能是1。

答案 1 :(得分:2)

在我们计算中间元素指数时的分而治之方法中,该均值是第一个和最后一个指数除以2的总和。

此外,当左元素索引与右元素索引相同时,则表示数组有一个元素,然后只返回该单个数组元素。

您的解决方案是:

 public class Helloworld{

 public static void main(String []args){
  int[] A = {0, 5, 281, 3, 9, 4, 88, 16, 17, 60};
int l = 0;
int r = A.length-1;
System.out.println("Maximum of the array: "+maxArray(A, l, r));
 }

 public static int maxArray(int[] A, int l, int r) {

//Assuming that the index of array is '0' and not '1', l is 0. Else, put 1.

if (l == r) { // checking codition/
    return A[l]; 
}

int mid = (l+r)/2; // Calculating mid.
int maxLeft = 0;
int maxRight = 0;

maxLeft = maxArray(A, l, mid);        
maxRight = maxArray(A, mid+1, r);

if (maxLeft < maxRight) {
    return maxRight;
} else return maxLeft;
}}