LeetCode第53题最大子数组和

继续打卡算法题,今天学习的是LeetCode第53题最大子数组和,这道题目是道中等题。算法题的一些解题思路和技巧真的非常巧妙,每天看一看算法题和解题思路,我相信对我们的编码思维和编码能力有一些提升。

分析一波题目

本题可以使用最笨的办法,把所有连续组合求出来,最后将计算得到最大和的组合。但是可以借助一些技巧,避免保存所有的组合,我们其实可以只要存一个最大的组合值就可以,每求一个组合就和最大值比较,如果当前组合大于最大值,就更新最大组合值。

其中一个比较好的解法思路是:

每次以某个元素为组合的最后一个元素,计算当前组合的和,如果大于之前最大的组合和,那么更新最大的组合和。

[-2,1,-3,4,-1,2,1,-5,4]为例,

1、先求-2结尾的组合,最大组合和是-2

2、求1结尾的组合,最大组合和是1

3、求-3结尾的组合,最大组合和是1

....以此类推

本题解题技巧

1、每得到一个组合,就更新最大组合和,不用等所有组合求出来后再计算最大组合和

2、本题以每个元素结尾的组合,组合最大值要么是它本身,要么是之前的最大值加上它本身

3、其实这就是动态规划思想。动态规划就是解决最值问题的。

编码解决

java 复制代码
class Solution {
    public int maxSubArray(int[] nums) {

        int max = nums[0];
        int pre = nums[0];
        for(int i=1; i<nums.length;i++) {
        //每次求以当前下标结尾的表示的最大子树组和
        //第i个结尾的 最大子数组和
        int temp = pre + nums[i];
        //求当前节点最大和
        pre = Math.max(temp, nums[i]);
        //求全局最大和
        max = Math.max(pre, max);
        }
        return max;
    }
}

总结

哈哈,本题采用动态规划思路虽然降低了朴素解法的复杂度,但是时间复杂度还需要O(n)。

题目最后要求使用使用分而治之思想,但是作者认为本题解决比分而治之思想更简单易懂。

相关推荐
_OP_CHEN17 小时前
算法基础篇:(八)贪心算法之简单贪心:从直觉到逻辑的实战指南
c++·算法·贪心算法·蓝桥杯·算法竞赛·acm/icpc·简单贪心
柠石榴17 小时前
GO-1 模型本地部署完整教程
开发语言·后端·golang
LaoZhangAI18 小时前
Gemini 2.5 Flash Image API尺寸设置完整指南:10种宽高比详解
前端·后端
小欣加油18 小时前
leetcode 2536 子矩阵元素加1
数据结构·c++·算法·leetcode·矩阵
橘颂TA18 小时前
【剑斩OFFER】算法的暴力美学——二维前缀和
算法·c/c++·结构与算法
月半流苏18 小时前
Problem: lab-week10-exercise02 Building a Fiber Network
c++·算法·并查集
考虑考虑18 小时前
springboot中yml、yaml、properties加载顺序
spring boot·后端·spring
xhxxx18 小时前
《大厂面试:从手写 Ajax 到封装 getJSON,再到理解 Promise 与 sleep》
ajax·面试
想用offer打牌18 小时前
seata的JacksonUndoLogParser回滚SerialArray类型的序列化和反序列化解析
后端·开源·github
武子康18 小时前
大数据-153 Apache Druid 实时接入 Kafka:从摄取到查询的完整实战
大数据·后端·nosql