贪心——53. 最大子数组和

简介: 本专栏按照数组—链表—哈希—字符串—栈与队列—二叉树—回溯—贪心—动态规划—单调栈的顺序刷题,采用代码随想录所给的刷题顺序,一个正确的刷题顺序对算法学习是非常重要的,希望对大家有帮助

1 题目描述

  1. 最大子数组和

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

子数组 是数组中的一个连续部分。

2 题目示例

示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

示例 2:
输入:nums = [1]
输出:1

示例 3:
输入:nums = [5,4,-1,7,8]
输出:23

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/maximum-subarray

3 题目提示

1 <= nums.length <= 10^5^
-10^4^ <= nums[i] <= 10^4^

4 思路

贪心贪的是哪里呢?
如果-2 1在一起,计算起点的时候,一定是从1开始计算,因为负数只会拉低总和,这就是贪心贪的地方!
局部最优:当前“连续和"为负数的时候立刻放弃,从下一个元素重新计算"连续和",因为负数加上下一个元素“连续和"只会越来越小。
全局最优:选取最大"连续和”
局部最优的情况下,并记录最大的“连续和”,可以推出全局最优。
从代码角度上来讲:遍历nums,从头开始用count累积,如果count一旦加上nums[i]变为负数,那么就应该从nums[i+1]开始从0累积count了,因为已经变为负数的count,只会拖累总和。
这相当于是暴力解法中的不断调整最大子序和区间的起始位置。
那有同学问了,区间终止位置不用调整么?如何才能得到最大"连续和"呢?
区间的终止位置,其实就是如果count取到最大值了,及时记录下来了。例如如下代码:

if (count > result) result = count;

这样相当于是用result记录最大子序和区间和(变相的算是调整了终止位置)。
image.png

红色的起始位置就是贪心每次取count为正数的时候,开始一个区间的统计。

时间复杂度:O(n)·空间复杂度:O(1)
当然题目没有说如果数组为空,应该返回什么,所以数组为空的话返回啥都可以了。
不少同学认为如果输入用例都是-1,或者都是负数,这个贪心算法跑出来的结果是0,这是又一次证明脑洞模拟不靠谱的经典案例,建议大家把代码运行一下试一试,就知道了,也会理解为什么result 要初始化为最小负数了。

5 我的答案

class Solution {
    public int maxSubArray(int[] nums) {
        if (nums.length == 1){
            return nums[0];
        }
        int sum = Integer.MIN_VALUE;
        int count = 0;
        for (int i = 0; i < nums.length; i++){
            count += nums[i];
            sum = Math.max(sum, count); // 取区间累计的最大值(相当于不断确定最大子序终止位置)
            if (count <= 0){
                count = 0; // 相当于重置最大子序起始位置,因为遇到负数一定是拉低总和
            }
        }
       return sum;
    }
}
相关文章
|
开发工具
推荐几款typora替代品
MarkText Typedown Atom
|
6月前
|
自然语言处理 数据处理 开发者
|
11月前
|
存储 Kubernetes Perl
K8S中Pod启动异常
【10月更文挑战第3天】
304 2
|
SQL JSON 前端开发
【源码免费下载】SpringBoot整合Spring+SpringMVC+MyBatisPlus案例:图书管理系统
【源码免费下载】SpringBoot整合Spring+SpringMVC+MyBatisPlus案例:图书管理系统
197 0
|
存储 运维 安全
MES生产管理系统:私有云、公有云与本地化部署的比较分析
企业在选择云计算部署方式时,应根据自身的业务需求、安全要求、成本预算和技术实力进行综合考虑。对于需要高度安全可控和个性化定制的企业,私有云可能是一个更好的选择;对于成本敏感、追求灵活性和快速扩展的企业,公有云可能更具吸引力;而对于对稳定性和安全性要求较高、对外部依赖度较低的企业,本地化部署可能更合适。在实际应用中,企业也可以考虑采用混合云策略,结合私有云、公有云和本地化部署的优势,实现资源的灵活配置和高效利用。
646 0
MES生产管理系统:私有云、公有云与本地化部署的比较分析
|
缓存
什么是http状态码?常见的有哪些?它们所代表什么含义?
什么是http状态码?常见的有哪些?它们所代表什么含义?
344 0
|
编译器 Python
Jupyter notebook安装教程
Jupyter Notebook 是以网页的形式打开,可以在网页页面中直接编写代码和运行代码,代码的运行结果也会直接在代码块下显示的程序。如在编程过程中需要编写说明文档,可在同一个页面中直接编写,便于作及时的说明和解释。
561 2
|
Java Linux 数据库连接
【Java】Centos7配置Nacos开机自启动并后台运行(包含使用Docker运行nacos)
【Java】Centos7配置Nacos开机自启动并后台运行(包含使用Docker运行nacos)
1417 0
|
SQL Java 数据库连接
五、MyBatis获取参数值的两种方式以及传参情况
${}的本质就是字符串拼接,#{}的本质就是占位符赋值。
434 0
五、MyBatis获取参数值的两种方式以及传参情况
|
Java jenkins 持续交付
手把手教你搭建Jenkins实现自动化部署Jar(上)
手把手教你搭建Jenkins实现自动化部署Jar(上)
512 0
手把手教你搭建Jenkins实现自动化部署Jar(上)