整个算法分类下:大部分都是借鉴左神的思路:
这里采用递归的方式,主要是为了学习递归的过程(如果仅仅是求最大值,可以直接遍历,然后标记出最大值即可)
递归方式:
public class Client {
public static void main(String[] args) {
int[] elems = {1,3,6,2};
System.out.println(getMax(elems,0,3));
}
public static int getMax(int[] arr, int left, int right){
if(left == right){
return arr[left];
}
int mid = (left + right) >> 1;// 表示除于2
int leftMax = getMax(arr,left,mid);
int rightMax = getMax(arr,mid+1,right);
return Math.max(leftMax,rightMax);
}
}
执行过程介绍:
首先执行main函数,首先将main函数压栈,然后往下执行,调用打印的方法,调用getMax方法:
1、一开始有四个数,首先left = 0 right = 3 ,即left 不等于right,所以往下执行,mid = (0+3)/2=1,执行到int leftMax = getMax(arr,0,1)时
2、此时left=0,right=1,即 left 不等于 right, mid = (0+1)/2=0,执行到 int leftMax = getMax(arr,0,0)
3、此时left=right=0,所以直接返回arr[0]=1
2、在原有的基础上,加上一个leftMax=1,然后执行int rightMax=getMax(1,1)
4、此时left=right=1,直接返回arr[1]=3
2、在原有的基础上,加上rightMax=3,然后执行Math.max(leftMax,rightMax) = 3
1、在原有的基础上,得到int leftMax = getMax(arr,0,1)=3,然后执行 int rightMax=getMax(arr,2,3)
5、此时left = 2, right = 3, 不相等,往下执行,mid = (2+3)/2=2 ,执行 int leftMax = getMax(arr,2,2)
6、此时left = 2, right = 2, 所以直接返回arr[2]=6
5、在原有的基础上加上 int leftMax = 6 然后执行 int rightMax = getMax(arr,3,3)
7、此时left=right = 3,所以直接返回arr[3]=2
5、在原有的基础上,加上int rightMax = 2, 返回: Math.max(leftMax,rightMax) = Math.max(6,2)=6
1、在原有的基础上,得到 int rightMax = getMax(arr,2,2)=6,最后执行 Math.max(leftMax,rightMax)=6
所以经过上述的过程,返回结果为6
递归行为有一个计算时间复杂度的公式:
T(N) = a * T(N/b) + O(N^d)
当 log(b,a) > d 时: T(N) = O(N^log(b,a))
当 log(b,a) = d 时: T(N) = O(N^d * logN)
当 log(b,a) < d 时: T(N) = O(N^d)
上述的解题过程: a = 2 , b = 2 , d = 0 所以log(2,2) = 1 所以 时间复杂度为T(N) = O(N)