找一个数组的最大值,方法很多,也很简单,一般再定义一个变量就可以了,就像下面这串代码。

int []arr=new int [] {1,22,3,44,5,6,76,118,91};int max=arr[0];for(int i=0;i<arr.length;i++) {if(max<arr[i]) {max=arr[i];}}System.out.println(max);

但今天的主题是使用递归,那我们先上代码,再介绍过程。

public static void main(String[] args) {int []arr=new int [] {22,3,44,5,76,118,91};System.out.println(getMax(arr));}public static int getMax(int [] arr) {return process(arr,0,arr.length-1);}public static int process(int [] arr,int L,int R) {if(L==R) { //如果arr[L....R]范围上只有一个数,那么直接返回就好;return arr[L];}int mid=L+((R-L)>>1);//这里>>1相当于除2,但是因为是符合二进制的机制,用左移1位表示除2,所以会比直接除快一点,但是差距很小,这里介绍就当做个拓展了解int leftMax=process(arr, L, mid);int rightMax=process(arr,mid+1, R);return Math.max(leftMax, rightMax);}

通过下图,我们发现使用递归求出了最大值。

我们用图画的方式来展示递归的运行过程,递归数据量太大的话,画出的流程图会比较杂,我们就举四个数,int [] arr=new int []{1,22,3,44},arr[0],arr[1],arr[2],arr[3];

红色箭头表示回溯,递归的一个支进程走到底(return)后就要往回走,向上寻找可以继续执行的代码。

进行比较的leftMax和rightMax需要属于同一个父进程,我用相同的数字下标表示这俩兄弟,比较后的较大值作为上一层的值。,这个求解的过程类似二叉树的后序遍历,在此基础上,添加了一个比较左右大小的过程。

可以看出,递归虽然只用几行代码,但是系统内运行的过程是很多的(案例里面比较的数还只是四个)。

small tips:

这里提一下关于计算中间值的俩种方式和注意点:

int mid=L+((R-L)/2);(改进式)

int mid=(L+R)/2;(常规方式)

注意点主要发生在大数运算中,俩个快要溢出的数相加那么就会溢出是不是,那么计算中间值就可以使用上面的改进式。

初识递归,使用递归方法求一个数组中的最大值相关推荐

  1. Java知识点串讲之简单的排序,求一个数组中的最大值

    要求: 去计算一个整数数组中最大的整数元素, 思路: 我们可以假设在数组中存在一个最大值,然后用最大值依次去和其他数值进行比较,从而拿到真实中的最大值 接下来我们来看代码 import com.whh ...

  2. 算法12--topK求一个数组中第k大的数

    求一个数组中第k大的值 解法一: 建立一个k个元素的最大堆,首先将数组中前k个元素放入堆中,此时堆顶元素为第k大的元素,后面继续遍历数组,比较堆顶元素与数组中元素值,当数组中元素小于堆顶元素时,将堆顶 ...

  3. C语言求一个数组中第k大的数,leetcode | Median of Two Sorted Arrays 寻找2个有序数组中第k大的值...

    There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted ...

  4. Leetcode-215:求一个数组中第k大的数

    题目描述 给定一个未排序的整数数组,找到其中第k大的数 样例: 给出数组[4,5,1,2,3]和k=3,返回3: 给出数组[7,9,4,5]和k=1,返回9. 要求时间复杂度为O(n),空间复杂度为O ...

  5. 算法题:找出一个数组中相加值最大的连续序列元素

    package arithmetic;/*** @author SHI* 求一个数组中相加值最大的连续序列元素*/ public class MaxSequence {public static vo ...

  6. 问题 H: 编写函数:求数组中的最大值 (Append Code)

    题目描述 现有一个不超过N个元素的数组,其中可能有重复数据出现.求该数组中的最大值以及最大值所在的下标. 结合"Append Code"中的代码,编写以下函数: 原型:int ge ...

  7. 寻找数组中的最大值和最小值

    解法1. 我们可以吧数字中的最大值和最小值看成两个独立的问题分别求出数组中的最大值和最小值. 直接的方法就是扫描数字,找到最大数以及最小数. <span style="font-siz ...

  8. 递归求嵌套数组中最大值

    今早在 https://attachments.me/hirehack/public/computer.html 做题,有一题是 递归求嵌套数组中最大值: /* This challenge requ ...

  9. 13.在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和。(左神算法基础班源码)

    package basic_class_01; /*** *小和问题在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和.求一个数组的小和.例子:[1,3,4,2,5]1左边比1小的数 ...

最新文章

  1. window 获取进程运行长
  2. SAP 零售行业相关的博客
  3. Linux—进程管理
  4. Android中用图片自定义一个进度条(实现蒙板效果)
  5. k8s集群RBAC安全机制:role rolebing user
  6. reactjs回调函数形式的ref:含内联形式回调函数调用次数问题
  7. java基础---IO转换流
  8. grpc java 泛型_关于使用GRPC遇到的BUG-Go语言中文社区
  9. 编程之美- 中国象棋将帅问题
  10. 网件rax40可以刷梅林_支持WiFi6,带宽达到3000Mbps,网件RAX40路由器评测 | 钛极客...
  11. php 判断昨天_PHP 判断时间在今天、昨天、前天、几天前几点
  12. CSS三种引入方式 常用样式 CSS选择器
  13. 十个最好的免费杀毒软件
  14. eclispe luna 安装subversive和svn connector插件
  15. 矩阵分析与应用-13-矩阵的迹
  16. 百度编辑器(ueditor)魔改:5、自定义一键排版(按照需求保留标签和样式)
  17. 禁用Win10驱动程序强制签名验证
  18. 屏通触控大师(PM Designer)快速入门
  19. NOIP中的数学--第6课 排列与组合
  20. 8b10b编码源码 matlab,8b/10b编码技术系列(一):Serdes、CDR、K码

热门文章

  1. 开源GIS平台空间数据管理与发布技术研究
  2. SanDisk发布iPhone专用iXpand闪存驱动器
  3. 。集线器端口上出现电涌是怎么回事
  4. 阿里语言AI技术全球第二;微软云计算副总裁宣布离职;腾讯与中国银行签署协议 | 每日大事件...
  5. Command兑现的三个主要方法
  6. metasploitable3 第一个flag, King of Diamond
  7. 谷歌和微软为何都执着于硬件?
  8. vb.net开发vbe插件,在vbe界面生成类似任务窗格的窗体
  9. 蓝桥杯第十一届Javac组国二感想
  10. 版本控制工具Git详细介绍和常用命令