初识递归,使用递归方法求一个数组中的最大值
找一个数组的最大值,方法很多,也很简单,一般再定义一个变量就可以了,就像下面这串代码。
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;(常规方式)
注意点主要发生在大数运算中,俩个快要溢出的数相加那么就会溢出是不是,那么计算中间值就可以使用上面的改进式。
初识递归,使用递归方法求一个数组中的最大值相关推荐
- Java知识点串讲之简单的排序,求一个数组中的最大值
要求: 去计算一个整数数组中最大的整数元素, 思路: 我们可以假设在数组中存在一个最大值,然后用最大值依次去和其他数值进行比较,从而拿到真实中的最大值 接下来我们来看代码 import com.whh ...
- 算法12--topK求一个数组中第k大的数
求一个数组中第k大的值 解法一: 建立一个k个元素的最大堆,首先将数组中前k个元素放入堆中,此时堆顶元素为第k大的元素,后面继续遍历数组,比较堆顶元素与数组中元素值,当数组中元素小于堆顶元素时,将堆顶 ...
- 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 ...
- Leetcode-215:求一个数组中第k大的数
题目描述 给定一个未排序的整数数组,找到其中第k大的数 样例: 给出数组[4,5,1,2,3]和k=3,返回3: 给出数组[7,9,4,5]和k=1,返回9. 要求时间复杂度为O(n),空间复杂度为O ...
- 算法题:找出一个数组中相加值最大的连续序列元素
package arithmetic;/*** @author SHI* 求一个数组中相加值最大的连续序列元素*/ public class MaxSequence {public static vo ...
- 问题 H: 编写函数:求数组中的最大值 (Append Code)
题目描述 现有一个不超过N个元素的数组,其中可能有重复数据出现.求该数组中的最大值以及最大值所在的下标. 结合"Append Code"中的代码,编写以下函数: 原型:int ge ...
- 寻找数组中的最大值和最小值
解法1. 我们可以吧数字中的最大值和最小值看成两个独立的问题分别求出数组中的最大值和最小值. 直接的方法就是扫描数字,找到最大数以及最小数. <span style="font-siz ...
- 递归求嵌套数组中最大值
今早在 https://attachments.me/hirehack/public/computer.html 做题,有一题是 递归求嵌套数组中最大值: /* This challenge requ ...
- 13.在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和。(左神算法基础班源码)
package basic_class_01; /*** *小和问题在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和.求一个数组的小和.例子:[1,3,4,2,5]1左边比1小的数 ...
最新文章
- Battery electric vehicles (BEVs) 快充技术
- js中substr,substring,indexOf,lastIndexOf的用法
- 沉甸甸的证书,沉甸甸的心情
- 是时候了解下无监督学习了!
- mysql 单号,利用 MySQL 自增列生成订单号
- tablespaces-datafiles示意图
- oracle主备库查询,oracle11g dataguard 备库数据同步的检查方法
- VHDL设计交通灯控制器的课程设计
- Web前端期末大作业--响应式电竞博客网页设计(HTML+CSS+JavaScript)实现
- Nacos长连接诉求分析
- 戴尔服务器bios修改风扇,BIOS风扇调整
- python counter转换为列表_Python标准库---collections.counter
- Circulation:胎儿脑体积预测先天性心脏病患儿的神经发育
- wxPython安装终极方法
- JS作用域和自由变量
- HDU 2542 树上战争
- word标尺单位怎么变更单位
- 2022年度总结和展望2023年
- 中文输入法怎样使用日语键盘(106/109)?
- seekbar双向调节