求一个数组中的最大值

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

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

递归方式:

   

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值