当前位置: 代码迷 >> 综合 >> 求一个数组中的最大值
  详细解决方案

求一个数组中的最大值

热度:1   发布时间:2024-01-27 23:37:52.0

整个算法分类下:大部分都是借鉴左神的思路:

这里采用递归的方式,主要是为了学习递归的过程(如果仅仅是求最大值,可以直接遍历,然后标记出最大值即可)

递归方式:

   

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;// 表示除于2int 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)

  相关解决方案