• 贪心——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 <= 105
    -104 <= nums[i] <= 104

    4 思路

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

    if (count > result) result = count;
    
    • 1

    这样相当于是用result记录最大子序和区间和(变相的算是调整了终止位置)。
    在这里插入图片描述
    红色的起始位置就是贪心每次取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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    QT中QString 转换为 char *的几种方法
    AB Test实验设计
    X11 Xlib截屏问题及深入分析三 —— 源码实现2
    Vue 3 第二十二章:组件十(组件高级特性-组件的渲染函数和JSX/TSX语法)
    【微信小程序】商品管理-微信小程序项目开发入门
    IObit Unlocker丨解除占用程序软件
    基于Matlab的车牌识别算法,Matlab实现
    Linux学习之:进程概念
    Linux(Centos)查看硬盘大小
    reduce方法的使用以及一些使用场景
  • 原文地址:https://blog.csdn.net/weixin_44688973/article/details/126009090