前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >贪心——53. 最大子数组和

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

作者头像
向着百万年薪努力的小赵
发布2022-12-02 11:15:36
3330
发布2022-12-02 11:15:36
举报
文章被收录于专栏:小赵的Java学习小赵的Java学习

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 <= 105 -104 <= nums[i] <= 104

4 思路

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

代码语言:javascript
复制
if (count > result) result = count;

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

在这里插入图片描述
在这里插入图片描述

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

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

5 我的答案

代码语言:javascript
复制
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;
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 题目描述
  • 2 题目示例
  • 3 题目提示
  • 4 思路
  • 5 我的答案
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档