目录

题目要求

实现思路

代码展示

代码讲解

总结


题目要求

在一个数组中,找到连续子数组的最大和。重点是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相关推荐

  1. 【剑指offer】面试题42:连续子数组的最大和(java)

    输入一个整型数组,数组里有正数也有负数.数组中的一个或连续多个整数组成一个子数组.求所有子数组的和的最大值. 要求时间复杂度为O(n). 示例1: 输入: nums = [-2,1,-3,4,-1,2 ...

  2. 剑指 Offer 42. 连续子数组的最大和java

    输入一个整型数组,数组中的一个或连续多个整数组成一个子数组.求所有子数组的和的最大值. 要求时间复杂度为O(n). 示例1: 输入: nums = [-2,1,-3,4,-1,2,1,-5,4] 输出 ...

  3. 连续子数组的最大和python_连续子数组的最大和

    题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求元素和值最大的那个子数组的和值. C#实现:public static int FindGreatestSum ...

  4. 算法题解:连续子数组的最大和及其下标

    题目 输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n). 举例 输入:2, -3, 4, 5, -9 输出:9 和最 ...

  5. 《剑指offer》-- 复杂链表的复制、字符串的排列、数组中出现次数超过一半的数字、连续子数组的最大和

    一.复杂链表的复制: 参考牛客网的chancy:https://www.nowcoder.com/questionTerminal/f836b2c43afc4b35ad6adc41ec941dba 1 ...

  6. 【最佳解法】剑指 Offer 42. 连续子数组的最大和

    我是小张同学,立志用最简洁的代码做最高效的表达 思路:动态规划 假设nums\textit{nums}nums 数组的长度是 nnn,下标从 000 到 n−1n-1n−1. 我们用 f(i)f(i) ...

  7. [剑指offer]面试题31:连续子数组的最大和

    面试题31:连续子数组的最大和 题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n). ❖ 解法一:举例分析数组的 ...

  8. 牛客题霸 [连续子数组的最大和] C++题解/答案

    牛客题霸 [连续子数组的最大和] C++题解/答案 题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和 ...

  9. 【LeetCode】剑指 Offer 42. 连续子数组的最大和

    [LeetCode]剑指 Offer 42. 连续子数组的最大和 文章目录 [LeetCode]剑指 Offer 42. 连续子数组的最大和 一.动态规划 一.动态规划 状态定义 设动态规划列表 dp ...

最新文章

  1. Docker、kubernetes、微服务、SpringBoot/Cloud...好乱!到底要不要学?
  2. CodeFirst 的编程方式
  3. 科学家发现鱼会数学,5以内的加减法难不倒它,网友:要多吃鱼了
  4. Freemaker FTL指令常用标签及语法
  5. Video Question Answering综述
  6. linux内核下载 编译
  7. linux mysql 静态库_Linux静态库与动态库实例详解
  8. hadoop--windows环境配置hadoop-3.2.2
  9. 服务器安装lnmp的时候出现client_loop: send disconnect: Connection reset by peer
  10. 浙大PAT乙级1004. 成绩排名 (20)
  11. HDU-1754 线段树的节点更新,储存区间的最大值
  12. python大作业 课设
  13. 【开发】MFC到Delphi的皮肤移植
  14. 从AWSome Day你可以学到什么?
  15. rtsp流浏览器播放方案
  16. 小米平板2,Windows10与Android互刷教程,小米平板2 线刷教程
  17. 宇视摄像机媒体流达到上限
  18. 硬盘安装win10,笔者教你如何一步步从硬盘安装win10系统
  19. 代码走查工具篇FxCop的规则总结与翻译_Part2
  20. linux 字符界面 office,Linux系统下对比永中office和wps的界面及字体,附对比图

热门文章

  1. C语言feof()函数判断文件位置指针到末尾
  2. CSS基础学习--16 Float(浮动)
  3. 线性时不变系统(LIT )
  4. 【配电网重构】基于matlab粒子群算法33节点配电网重构【含Matlab源码 1829期】
  5. 微信web开发者工具报错笔记
  6. ML机器学习算法笔记
  7. C语言for语句简单打印心形。
  8. [译] 前端攻略-从路人甲到英雄无敌二:JavaScript 与不断演化的框架
  9. Python变量的定义和使用
  10. 通过selenium实现模拟浏览器操作