LeetCode第53题 - 最大子序和

题目

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

解答

方案一:

public int maxSubArray(int[] nums) {if (nums == null || nums.length == 0) {return 0;}int[] sums = new int[nums.length];for (int i = 0; i < nums.length; ++i) {sums[i] = Integer.MIN_VALUE;}sums[0] = nums[0];int max = nums[0];for (int i = 1; i < nums.length; ++i) {sums[i] = nums[i] + sums[i - 1];if (sums[i] < nums[i]) {sums[i] = nums[i];}if (max < sums[i]) {max = sums[i];}}return max;
}

方案二:

public int maxSubArray(int[] nums) {if (nums == null || nums.length == 0) {return 0;}int pre = nums[0];int max = nums[0];for (int i = 1; i < nums.length; ++i) {int current = nums[i] + pre;  // 1 求和if (current < nums[i]) {      // 2 比较current = nums[i];}if (max < current) {max = current;}pre = current;}return max;
}

方案三:

public int maxSubArray(int[] nums) {if (nums == null || nums.length == 0) {return 0;}int sum = nums[0];int max = nums[0];for (int i = 1; i < nums.length; ++i) {if (sum > 0) {sum += nums[i];}else {sum = nums[i];}max = Math.max(sum, max);}return max;
}

要点
依据题目的要求,数组P由N个元素组成,则一个连续子序列的定义为i、j,其中0<i<j<N-1,则子序列的和即可表示为SUM(i, j) = SUM(P[i]+...+P[j])
本题目的要求,即是找到一对i、j,使得其和最大。
按照上述定义,假设i、j即为数组P的最大子序列,则显然,i、j同样为0、j数组的最大子序列,这样,可以把问题描述为,给定数组k,求出序列0、k之间的最大子序列。
按照这个思路,使用数组来保存子序列的和,把子序列的和存储至对应的位置,然后找到最大值,即完成求解,这是方案一的实现代码。
仔细观察方案一的求解过程,可以发现,对于给定的位置i,实际上我们只关注i和i-1两个位置的子序列的和,这说明并不需要保存全部的子序列的和,因此可以进一步简化实现,减少对空间的讲求,可以得到方案二的实现代码。
观察方案二的求解过程,在循环中,首先求出当前位置i的子序列的和,然后再和i-1位置的子序列的和进行比较,假如子序列i的最大和比数组i的元素还要小,说明0至i的最大子序列只包含位置i上的元素。子序列i的最大和比数组i的元素还要小,即子序列i的最大和为负数,说明其值为负数,此时可以进一步简化实现方案,得到方案三的实现代码。

上述三个方案的求解复杂度为O(N)。

准备的用例,如下

@Before
public void before() {t = new Solution();
}
@Test
public void test001() {assertEquals(6, t.maxSubArray(new int[] { -2, 1, -3, 4, -1, 2, 1, -5, 4 }));
}
@Test
public void test002() {assertEquals(1, t.maxSubArray(new int[] { 1 }));
}@Test
public void test003() {assertEquals(0, t.maxSubArray(new int[] { 0 }));
}@Test
public void test004() {assertEquals(-1, t.maxSubArray(new int[] { -1 }));
}@Test
public void test005() {assertEquals(-100000, t.maxSubArray(new int[] { -100000 }));
}

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

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

相关文章

cleanmymac这个软件怎么样?值不值得下载

cleanmymac是我必装的mac端清理软件&#xff0c;界面简洁好看&#xff0c;完美适配mac系统&#xff0c;文件清理的速度、精度都比较优秀&#xff0c;还是比较不错的呢。cleanmymac作为一款第三方清洁应用程序&#xff0c;具有专业完整的清理功能&#xff0c;包括释放内存、一键…

【Redis交响乐】Redis中的通用命令

文章目录 1. 基本命令 get set2. 全局命令(1)keys(2)exists(3)del(4)expire && ttl面试题: redis中key的过期策略是怎么实现的?定时器的实现原理(1)基于优先级队列/堆(2)基于时间轮实现的定时器 (5) type 我们知道,redis是按照键值对的方式存储数据的. Redis中基本的命…

前端知识的不足与补充

css中的grid布局 display: grid;grid-template-columns: 1fr 25px 25px 25px 25px 1fr;grid-template-rows: 50px 1fr 1fr 50px;/* 创造一个网格布局6 个纵列&#xff08;column&#xff09; -- 前后两列两等分 (可用 fr 代表一份)&#xff0c;中间 4 列均为 25px 宽度4 个横行…

[Mac软件]App Cleaner Uninstaller 8.2.5应用程序清理和卸载

App Cleaner & Uninstaller是一款Mac应用程序&#xff0c;它可以帮助用户完全删除应用程序及其相关的服务文件、扩展文件等。以下是该应用程序的主要功能&#xff1a; 1. 完全删除应用程序&#xff1a;通过将应用程序图标拖到垃圾桶中删除程序&#xff0c;可以彻底清除应用…

【微服务核心笔记】

一、注册中心 Nacos Alibaba Nacos,服务提供者和服务消费者将自己的信息注册到注册中心,注册中心通过心跳机制来确保每个服务都可以正常运行,服务消费者订阅注册中心,注册中心为服务消费者推送变更信息 1、功能 动态服务发现配置管理2、搭建 创建 nacos 所需要的数据库在服…

根据文法求对应的语言

技巧&#xff1a;最后得到的是终结符组成的闭包 例题&#xff1a; 文法G[S]: S-->AB A-->aAb|ab B-->Bc|&#xff0c;求对应的语言 ①S-->(aAb|ab)(Bc|) ②我们可以观察到&#xff0c;无论A-->aAb还是A-->ab&#xff0c;都一定会同时出现ab,…

3、python-常见数据类型-元组(tuple)

简介 元组是一种不可变序列 元组也是一种序列&#xff0c;因此也可以对它进行索引、分片 一.定义元组 # TODO a 是一个元组 a (1, 2, 3) # TODO 空元组 b () # TODO 元组是以逗号分割 c (12) d (12,) print(a) print(b) print(c) print(d)# (1, 2, 3) # () # 12 # (12,)…

Java学习——设计模式——结构型模式1

文章目录 结构型模式代理模式适配器模式 结构型模式 结构型模式主要涉及如何组合各种对象以便获得更好、更灵活的结构。虽然面向对象的继承机制提供了最基本的子类扩展父类的功能&#xff0c;但结构型模式不仅仅简单地使用继承&#xff0c;而更多地通过组合与运行期的动态组合来…

NModbus-一个C#的Modbus协议库实现

NModbus-一个基于C#实现的Modbus通信协议库 最近在学习C#的时候&#xff0c;因为之前做过环保设备时使用C做过环保设备采集使用到了Modbus协议&#xff0c;当时看了一下基于C语言开发的libmodbus库。所以特意搜索看了一下C#下有什么Modbus协议库&#xff0c;在Github上面找了一…

Spring Cloud Gateway之Predicate断言详解

目录 Predicate&#xff08;断言&#xff09;内置Predicate请求参数匹配请求路径匹配Header 属性匹配Cookie 匹配请求方式匹配请求 ip 地址匹配时间匹配组合匹配 Predicate&#xff08;断言&#xff09; 在 Spring Cloud Gateway 中&#xff0c;Predicate&#xff08;断言&…

K8S学习指南(49)-k8s的证书管理

文章目录 引言什么是证书管理&#xff1f;证书管理的基本流程1. 证书生成2. 证书签发3. 证书使用4. 证书更新 Kubernetes 证书管理示例1. 生成自签名证书2. 使用自签名证书3. 部署使用证书的应用 证书续期与更新结论 引言 Kubernetes&#xff08;K8s&#xff09;是一款开源的容…

idea 如何开启mybatis控制台SQL日志打印

开启 application.yaml mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: truetypeAliasesPackage: XXXXmapper-locations: c…

【AI】人工智能爆发推进器之知识图谱

目录 一、什么是知识图谱 二、知识图谱的发展历程 三、知识图谱的应用场景 四、知识谱图的例子 知识图谱&#xff0c;一度被称作是人工智能的基石&#xff0c;这是应用组普遍的技术或者说是理念。 一、什么是知识图谱 **知识图谱&#xff08;Knowledge Graph&#xff09;…

node.js对应npm安装和使用

介绍 node.js是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;安装node后自带npm。NPM &#xff1a;Node Package ManagerNPM是Node.js标准的软件包管理器 。2010年底&#xff0c;Node.js 的包管理器 npm 诞生&#xff0c;是全球最大的开源库生态系统。 node 20…

SONiC和ONL所依赖的Debian版本说明

Debian 的最新几个版本 下一代 Debian 正式发行版的代号为 trixie — 测试&#xff08;testing&#xff09;版 Debian 12 (bookworm) — 当前的稳定&#xff08;stable&#xff09;版 Debian 11 (bullseye) — 当前的旧的稳定&#xff08;oldstable&#xff09;版 Debian 10&a…

idea配置docker推送本地镜像到远程私有仓库

目录 1&#xff0c;搭建远程Docker 私有仓库 Docker registry 2&#xff0c;Windows10/11系统上安装Docker Desktop 3&#xff0c;idea 配置远程私有仓库地址 4&#xff0c;idea 配置Docker 5&#xff0c;idea在本地构建镜像 6&#xff0c;推送本地Docker镜像到远程 Dock…

线性代数——(期末突击)行列式(上)-行列式计算、行列式的性质

目录 行列式 行列式计算 逆序数 行列式的性质 转置 两行&#xff08;列&#xff09;互换 两行&#xff08;列&#xff09;对应相等 提公因子 两行&#xff08;列&#xff09;对应成比例 某行&#xff08;列&#xff09;为零 行列式分裂 行列式变换及三角行列式 行…

Leetcode.2735 收集巧克力

题目链接 Leetcode.2735 收集巧克力 rating : 2043 给你一个长度为 n n n、下标从 0 0 0 开始的整数数组 n u m s nums nums&#xff0c; n u m s [ i ] nums[i] nums[i] 表示收集位于下标 i i i 处的巧克力成本。每个巧克力都对应一个不同的类型&#xff0c;最初&#xff…

通过ADB来实现脚本来控制手机

ADB 简介 adb的全称为Android Debug Bridge,安卓调试桥,可以通过调试命令来控制手机,诸如开机,关机等按键控制;或者启动,关闭应用;异或进行触摸模拟. 通过学习adb,可以实现简单的脚本控制,最大的特点是不需要root,对于普通手机都可以进行,帮助我们完成一些简单的重复性事件,…

centos搭建kubernetes集群步骤

目录 1. 修改host 2. 时间同步 3. 禁用firewalled 4. 禁用selinux 5. 禁用swap 6. 网桥设置 7. docker安装 8. 安装k8s 9. 异性操作 10. 配置flannel​​​​​​​ 1. 修改host cat >> /etc/hosts << EOF 172.16.188.175 master 172.16.188.176 node1 …