连续子数组的最大和Java
目录
题目要求
实现思路
代码展示
代码讲解
总结
题目要求
在一个数组中,找到连续子数组的最大和。重点是1.连续 2.最大 3.和。我们把它翻译成人话,举个例子:arr=[1, -2, 3, 1]。返回值:4。因为arr[2]+arr[3]有最大值4。
结果不是5,因为arr[0]+arr[2]+arr[3]并不连续。(另外,我们不需要返回是谁加谁才有最大值,作为剑指offer中比较简单的题,我们只需要返回最大和即可)
实现思路
我们需要用到当前和currentSum,前次和lastSum,最大和maxSum等变量,以及一个单层循环来辅助我们完成这个方法。让我们了解一下以上概念。
之前和:每次循环末把之前值更新为当前值。第一次循环没有之前和
当前和:若之前和非负,则说明当前值加之前和后至少不会小于当前值,那么当前和等于当前值加之前。否则说明相加只会更小,那就令当前和等于当前值(贪心算法)。另外,第一次循环时,当前和等于当前元素
最大和:拿最大和与当前和作比较,谁大谁成为本次的最大和。另外,第一次循环时最大和等于当前元素
我们现在用数组 [1, -2, 3, 1] 来理解这个实现思路。
第一次(当前值=1):当前和=1,最大和=1,没有前次和。
第二次(当前值=-2):前次和=1,那么当前和=前次和1+当前值-2=-1,最大和=1不变(因为当前和-1<最大和1)。
第三次(当前值=3):由于前次和=-1<0,因此若让当前和=当前值3+前次和-1,结果一定小于当前值3。如果我们这样,虽然2>1使得最大和=2,但是我们没有得到真正的最大值3。因此当前和=当前值=3,不加上前次和。更新最大和=3(因为当前和3>最大和1)
第四次(当前值=1):前次和=3,那么当前和=前次和+当前值=4,更新最大和=4(因为当前和4>最大和3)
退出循环并返回最大和
代码展示
package advance.algorithm;public class MaxSubArr {public static int solution1(int[] arr) {//beter algorithmint lastSum=-1,currentSum,maxSum = Integer.MIN_VALUE;for(int i=0;i<arr.length;i++) {if(lastSum<0)currentSum=arr[i];elsecurrentSum=lastSum+arr[i];if(currentSum>maxSum)maxSum=currentSum;lastSum=currentSum;}return maxSum;}
//测试public static void main(String[] args) {int[] arr={8,1,-3,-3,-1,2,1,-5,4};System.out.println("max value="+solution1(arr));}
}
代码讲解
这里简单的讲一下。在solution1()方法中,lastSum初始化时被赋值为-1的原因是我们想要让循环第一次lastSum不参与加和,即模拟第一次循环没有lastSum的效果,而从第一次循环末把lastsum更新为currentSum。
max被设置为了Integer.MIN_VALUE......这又是什么呢?这其实是个常数,表示的是整数类型可以表示的最小数,是-2^31。大家相信也能看出把最大值设置成-2^31用意,就是这样不管循环第一次的元素有多小,max总是比他小,于是max可以被更新为该元素值。
其他代码逻辑在"实现思路"这一模块都讲过了,这里就不再赘述。
总结
其实这道题的解决思路有很多种,有暴力搜索(这个不推荐,不仅代码又臭又长,时间复杂度还是O(n^3)),有动态规划,有前缀和,还有分治算法。而我们这篇文章讲的贪心算法独树一帜。虽然很少人会想到,但也着实是一个非常优秀的方法,他的时间复杂度小于上面讲的大部分算法。
所以推荐大家使用该算法!
连续子数组的最大和Java相关推荐
- 【剑指offer】面试题42:连续子数组的最大和(java)
输入一个整型数组,数组里有正数也有负数.数组中的一个或连续多个整数组成一个子数组.求所有子数组的和的最大值. 要求时间复杂度为O(n). 示例1: 输入: nums = [-2,1,-3,4,-1,2 ...
- 剑指 Offer 42. 连续子数组的最大和java
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组.求所有子数组的和的最大值. 要求时间复杂度为O(n). 示例1: 输入: nums = [-2,1,-3,4,-1,2,1,-5,4] 输出 ...
- 连续子数组的最大和python_连续子数组的最大和
题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求元素和值最大的那个子数组的和值. C#实现:public static int FindGreatestSum ...
- 算法题解:连续子数组的最大和及其下标
题目 输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n). 举例 输入:2, -3, 4, 5, -9 输出:9 和最 ...
- 《剑指offer》-- 复杂链表的复制、字符串的排列、数组中出现次数超过一半的数字、连续子数组的最大和
一.复杂链表的复制: 参考牛客网的chancy:https://www.nowcoder.com/questionTerminal/f836b2c43afc4b35ad6adc41ec941dba 1 ...
- 【最佳解法】剑指 Offer 42. 连续子数组的最大和
我是小张同学,立志用最简洁的代码做最高效的表达 思路:动态规划 假设nums\textit{nums}nums 数组的长度是 nnn,下标从 000 到 n−1n-1n−1. 我们用 f(i)f(i) ...
- [剑指offer]面试题31:连续子数组的最大和
面试题31:连续子数组的最大和 题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n). ❖ 解法一:举例分析数组的 ...
- 牛客题霸 [连续子数组的最大和] C++题解/答案
牛客题霸 [连续子数组的最大和] C++题解/答案 题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和 ...
- 【LeetCode】剑指 Offer 42. 连续子数组的最大和
[LeetCode]剑指 Offer 42. 连续子数组的最大和 文章目录 [LeetCode]剑指 Offer 42. 连续子数组的最大和 一.动态规划 一.动态规划 状态定义 设动态规划列表 dp ...
最新文章
- Docker、kubernetes、微服务、SpringBoot/Cloud...好乱!到底要不要学?
- CodeFirst 的编程方式
- 科学家发现鱼会数学,5以内的加减法难不倒它,网友:要多吃鱼了
- Freemaker FTL指令常用标签及语法
- Video Question Answering综述
- linux内核下载 编译
- linux mysql 静态库_Linux静态库与动态库实例详解
- hadoop--windows环境配置hadoop-3.2.2
- 服务器安装lnmp的时候出现client_loop: send disconnect: Connection reset by peer
- 浙大PAT乙级1004. 成绩排名 (20)
- HDU-1754 线段树的节点更新,储存区间的最大值
- python大作业 课设
- 【开发】MFC到Delphi的皮肤移植
- 从AWSome Day你可以学到什么?
- rtsp流浏览器播放方案
- 小米平板2,Windows10与Android互刷教程,小米平板2 线刷教程
- 宇视摄像机媒体流达到上限
- 硬盘安装win10,笔者教你如何一步步从硬盘安装win10系统
- 代码走查工具篇FxCop的规则总结与翻译_Part2
- linux 字符界面 office,Linux系统下对比永中office和wps的界面及字体,附对比图