前提是这是作业,我不知道为什么我不能使用标签'家庭作业'所以为了清楚起见,我会在这里写下来。
我必须写一个方法" 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;
}
}
答案 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;
}}