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

题目

输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。

举例

输入:2, -3, 4, 5, -9

输出:9

和最大的连续子数组是 {4, 5},结果就是9。

思路

我们先假设和最大连续子数组是从第一个数开始的。初始化和为0。第一步是加上数字2,此时和为2。第二步加上数字-3,此时和为-1。那么问题来了,我们到底要不要加上数字-3呢?分析过程如下:

  1. 加上-3。此时的和为-1,然后由-1继续加下一个数。
  2. 不加-3。也就是意味当前连续子数组就终结于-3之前的数字,下一个连续子数组的和初始化为0,再加上第一个数字-3,和为-3。

由上述分析可知,加上-3,此时累加的子数组和是-1;不加-3,此时累加的子数组和是-3。-1大于-3,为了后续的累加和更大,所以选择加上-3。

接下来,第三步要不要加上数字4,我们依据上面的决策流程继续分析。当加上数字4,此时累加和为4-1=3;不加上数字4,意味着当前连续子数组终结于数字4之前,此时的累加和初始化为0,加上数字4后和等于4。显而易见,4大于3,所以我们选择抛弃前面的累加和,由数字4继续开始。

后续步骤省略,总结一番。当我们遍历数组时,对于每个数字,要么与前面的子数组累加,要么作为新子数组的起点,如果累加之后的子数组和小于(或等于)当前数字,我们就选择抛弃前面的累加和,将当前数字作为新子数组的起点。整个过程可以用表格总结如下:

步骤操作累加的子数组和最大的子数组和
1加222
2加-3-12
3抛弃累加的和-1,加444
4加599
5加-909

代码

根据题目要求,我们只需要求出连续子数组的最大和,如果面试官还要求找到连续子数组的起点与终点下标,那么最终的java代码如下:

public class Main {public static int child_sum(int[] arr) {if (arr == null || arr.length < 1) {return 0;}int left0 = 0;int left1 = 0;int right = 0;int max = arr[0];int sum = 0;for (int i = 0; i < arr.length; i++) {sum += arr[i];if (sum <= arr[i]) { //使用<=还是<呢?sum = arr[i];left0 = i;}if (sum > max) {max = sum;left1 = left0;right = i;}}System.out.println("left:" + left1 + " right:" + right + " max:" + max);return max;}public static void main(String[] args) {int[] arr1 = new int[]{2, -3, 4, 5, -9};int[] arr2 = new int[]{2, -2, 4, 5, -9};int[] arr3 = new int[]{-2, -3, -4, -5, -9};child_sum(arr1);child_sum(arr2);child_sum(arr3);}
}

打印输出:

left:2 right:3 max:9
left:2 right:3 max:9
left:0 right:0 max:-2

在上面的代码中使用小于等于或者使用小于有什么区别呢?

假设数组为{2, -2, 4, 5, -9},如果判断条件是小于等于当前数字,那么所得的最大连续子数组为{4, 5}。如果判断条件是小于当前数字,那么所得的最大连续子数组为{-2, 2, 4, 5}。如果对最大连续子数组的长度没有明确要求,使用小于等于进行判断即可。

转载于:https://www.cnblogs.com/yueshutong/p/11469200.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362918.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简而言之,JUnit:Hello World

对于Java世界中的开发人员而言&#xff0c; JUnit似乎是最受欢迎的测试工具 。 因此&#xff0c;难怪就此主题已经写了一些好书 。 但是&#xff0c;通过以顾问为生&#xff0c;我仍然经常遇到程序员&#xff0c;他们至多对工具及其正确用法都不了解。 因此&#xff0c;我想到…

jQuery获取所有父级元素及同级元素及子元素的方法

jQuery获取所有父级元素及同级元素及子元素的方法 1.获取父级元素 $("#id").parent() 获取其父级元素 $("#id").parents() 获取其所有的祖先元素 $("#id").closest() 获取其最近的祖先元素&#xff0c;依次上溯 2.获取同级元素 $("#…

考取RHCE认证的历程,总结的经验

昨天去考试的&#xff0c;今天下午结果出来了&#xff0c;达到了我的预期。成功的获取了RHCE认证&#xff0c;以后我也是有证的人咯~&#xff0c;开个玩笑。 其实去年的时候我就曾经想要去考取的&#xff0c;我原来一直以为考取RHCE认证时考题都是英文的呢&#xff1f;因为我英…

Python萌新笔记

Mychael上了大学&#xff0c;对Python产生了浓厚的兴趣&#xff0c;便开始了Python的学习 学习的时候&#xff0c;感觉Python确实比以往学的C表达简洁很多&#xff0c;而又不失强大 以后的学习笔记就记在这啦 变量 Python中的变量无需声明&#xff0c;其类别也只有具体赋值的时…

明天一定要记得放一个硬币在口袋

以前上班总是从陆家嘴站下来&#xff0c;然后走到公司。现在改从东昌路站下。地铁陆家嘴站附近&#xff0c;现在正忙着收尾世博前的那些形象工程。满地的泥土、污水&#xff1b;空气中充斥着机器的轰鸣声、粉尘、烟雾、臭气。更让人难受的还有哪些长着&#xff0c;遭受了地震蹂…

命令设计模式的应用

嗨&#xff0c;您好&#xff01; 今天&#xff0c;我将与您分享一种非常出色的编程设计模式。 它有很多用法&#xff0c;是我的最爱之一。 编程设计模式命令具有多种用例。 在这篇文章中&#xff0c;我们将看到如何实现现实世界中的某些东西。 我们将使用电子汽车钥匙来打开&…

代码块,-- 循环结构--字符串的格式化--字符串相关函数功能

### -代码块 以冒号作为开始,用缩进来划分相同的作用域,称之为代码块,代码块是一个整体,一个文件也可称代码块 作用域&#xff1a;作用的区域 ### -流程控制 (1)流程控制的定义 (2)流程控制的结构 ### -分支结构 关键字:if elif else (1)分支结构的种类 (2)分支结构的特点 ###…

adodb.stream对象的方法/属性

cancel 方法 使用方法如下 object.cancel 说明&#xff1a;取消执行挂起的异步 execute 或 open 方法的调用。 close 方法 使用方法如下 object.close &#xff1a;关闭对像 copyto 方法 使用方法如下 object.copyto(deststream,[charnumber]) 说明&#xff1a;将对像的数据复制…

MongoDB非关系型数据库开发手册

一&#xff1a;NoSql数据库 什么是NoSQL? NoSQL&#xff0c;指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写&#xff0c;是对不同于传统的关系型数据库的数据库管理系统的统称。 NoSQL用于超大规模数据的存储。&#xff08;例如谷歌或Facebook每天为他们的用户收…

Spring Batch作为Wildfly模块

长期以来&#xff0c;Java EE规范缺少批处理API。 今天&#xff0c;这对于企业应用程序来说是必不可少的。 这是最后固定与JSR-352批处理应用程序的Java平台现在的Java EE提供7 JSR-352得到了它的的灵感Spring Batch的对手。 两者涵盖相同的概念&#xff0c;尽管生成的API有所不…

springCloud Eureka 注册中心原理及配置理解(一)

Eureka 原理与步骤原理&#xff1a;服务提供方启动后将注册到 注册中心&#xff0c;提供IP, 名字&#xff0c;什么服务等信息&#xff0c;服务调用方作为客户端注册到注册中心后&#xff0c;拉取注册中心的服务列表&#xff0c;在通过负载均衡调用对应的服务提供方。注册中心可…

react系列教程

这个系列将从基础语法讲起&#xff0c;把react全家桶都讲到&#xff0c;然后到具体的使用&#xff0c;最后完成后&#xff0c;会写一个完整的demo。 前置要求&#xff1a; 基本的CSS&#xff0c;JS要熟练。 部分ES6语法需要了解。可以参考下面提到的阮一峰老师的《ECMAScript …

解决DataGridView绑定List后不能排序的问题

阅读全文并下载例子 &#xff1a;http://www.sufeinet.com/forum.php?modviewthread&tid190 以前不都是用table直接绑定DataGridView的&#xff0c;没有出现过不能排序的问题&#xff0c;初试List结果发现不管怎么样都不能实现排序的功能&#xff0c;有朋友说 DataGridVie…

maven编译的时候排除junit测试类

maven编译的时候排除junit测试类 maven项目中使用junit进行单元测试&#xff0c;在进行编译的时候&#xff0c;可以通过2种方式排除test测试类的编译。 有2种方式 &#xff1a; 使用命令的时候带上参数 mvn install -Dmaven.test.skiptrue 在pom.xml里面配置<plugins><…

生成器设计模式的应用

嗨&#xff0c;您好&#xff01; 今天&#xff0c;我将分享我制作的全新设计模式系列的第一个。 构建器设计模式是开发严肃的应用程序时非常有用且通用的模式。 在这篇文章中&#xff0c;我将提供一个很小的构建器模式框架&#xff0c;因此您随时可以回到这里并使用它。 助记…

知识整理2019清北学堂提高储备D5

今天主讲图论。 前言&#xff1a;图的定义&#xff1a;图G是一个有序二元组(V,E)&#xff0c;其中V称为顶集(Vertices Set)&#xff0c;E称为边集(Edges set)&#xff0c;E与V不相交。它们亦可写成V(G)和E(G)。 一、图的存储&#xff1a; 1、邻接矩阵&#xff1a; 2、邻接表&am…

IIFE(立即执行函数表达式)

我们经常会看到这样的写法&#xff1a; ;(fuction () {// do something })() 这就是一个简单的IIFE&#xff08;立即执行函数表达式&#xff0c;immediately-invoked function expression&#xff09;了。 这样的写法有什么好处呢&#xff1f;来简单分析一下。 1. 开头的分…

中文(英译) 爱情一句话哲理

⊙ 宁可失败在你喜欢的事情上&#xff0c;也不要成功在你所憎恶的事情上。 To lost in something you love is better than to win in something you hate.   ⊙ 幸福&#xff0c;不是长生不老&#xff0c;不是大鱼大肉&#xff0c;不是权倾朝野。幸福是每一个微小的生活愿望…

CSS之文字溢出处理

1.单行文本之三剑客<p>刘诗诗&#xff0c;原名刘诗施&#xff0c;1987年3月10日出生于北京市&#xff0c;中国内地影视女演员、影视出品人。</p>p{border: 1px solid red;width: 400px;height: 40px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis…

JavaFX技巧5:可观察

即使在整个NSA监视的这段时间&#xff0c;实现JavaFX控件时也要牢记可观察性&#xff0c;这仍然是一个好主意。 与Swing相比&#xff0c;这在JavaFX中很容易实现。 旧时光 来自Swing&#xff0c;我习惯于花费大量精力和时间来使自定义控件变得可观察。 通常需要添加方法来添加…