拿到这个题,很懵
public class GetMax {
public static void main(String[] args) {
int[] arr = {1, 5, 9, 3, 5, 4, 8, 8, 100};
System.out.println(getMax(arr, 0, arr.length - 1));
}
public static int getMax(int[] arr, int start, int end) {
if (start == end) {
return arr[start];
}
int mid = start + (end - start) / 2;
int left = getMax(arr, start, mid);
int right = getMax(arr, mid + 1, end);
return Math.max(left, right);
}
}
有一点坑的
这样也行
public class GetMax {
public static void main(String[] args) {
int[] arr = {1, 5, 9, 3, 5, 4, 8, 8, 100};
System.out.println(getMax(arr, 0, arr.length - 1));
}
public static int getMax(int[] arr, int start, int end) {
if (start == end) {
return arr[start];
}
int mid = start + (end - start) / 2+1;
int left = getMax(arr, start, mid-1);
int right = getMax(arr, mid, end);
return Math.max(left, right);
}
}
不好写的。
mid如果不加一,只能左边=start+mid,因为 int 向下取整,所以 ( start + mid ) / 2 只要不是整除,就都比实际值少1,所以第一种方法里,left不动,右边 start = mid+ 1。
补救的方法就是,mid 计算时直接+1,那么left再减1,至少也是和原来的范围一样长,即使超了也只是超1, 那么右边right就可以不用变了。