当前位置: 首页 > news >正文

【LeetCode】算法详解#3 ---最大子数组和

1.题目介绍

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

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

  • 1 <= nums.length <= 105
  • -104 <= nums[i] <= 104

2.解决思路

        要求出一个数组中和最大的子数组的和,这通常有很多种解法,比如暴力遍历、分治、动态规划等,我这里采用动态规划去解决,具体思路如下:既然要求出和最大的值,那么肯定要有一个变量f1用来记录最大的值,至于如何求出最大的值是多少,我们可以采用循环比较的方法不断取 i 和i-1 之间的最大值,并用临时值记录f2下来,如果数组从前向后不断增大,那么显而易见这个临时值f2表示的就是当前位置 i 的前缀和,也就是当前的最大和的数组,并不断将这个最大值赋值给f1。若遍历过程中出现了一个负数,中间值会变小。最大值f1通过比较仍取相对大的原值,也就是f1记录的永远是最大和子数组。然后中间值继续向后遍历,同样的逻辑,比f1更大则赋值给f1,比f1小则继续向后遍历,最终f1记录的就是和最大的子数组的和。

3..步骤讲解

        1.定义maxSum记录最大数组和,currentSum记录遍历过程中的临时值

        2.遍历数组

        3.不断比较当前遍历到的值与临时值+当前遍历值的大小,取最大值

        4.临时值与最大值进行比较,保持maxSum永远记录最大值

        5.返回结果

4.代码展示      

public int maxSubArray(int[] nums) {
        //记录最大值
        int maxSum = nums[0];
        //记录中间值
        int currentSum = nums[0];
        for (int i = 1; i < nums.length; i++) {
            //比较临时值增大还是减小
            currentSum = Math.max(nums[i], currentSum + nums[i]);
            //永远保持记录最大值
            maxSum = Math.max(maxSum, currentSum);
        }
        return maxSum;
}

5.执行结果

在leetcode测试用例中平均耗时1ms

内存分布56.11MB

相关文章:

  • 人工智能新时代:从深度学习到自主智能
  • 人工智能:深度学习关键技术与原理详解
  • LeetCode 解题思路 30(Hot 100)
  • 硬盘分区格式之GPT(GUID Partition Table)笔记250407
  • 【k8s学习之CSI】理解 LVM 存储概念和相关操作
  • 喂饭教程-Dify如何集成RAGFlow知识库
  • [ISP] ISP 中的 GTM 与 LTM:原理、算法与与 Gamma 校正的对比详解
  • Token+JWT+Redis 实现鉴权机制
  • 2024年十五届蓝桥杯青少年Scratch省赛初级组——找不同
  • 极空间NAS进阶玩法:Debian 系统安装教程
  • Docker学习--卷相关命令
  • 瓦片数据合并方法
  • 【R语言绘图】圈图绘制代码
  • 分割回文串 复原IP地址(Java)
  • 光场调制技术在超快激光加工中的应用
  • (高频SQL50题)1667. 修复表中的名字
  • springboot+vue2集成JWT token实现权限验证
  • 如何更好的理解 beforeEach 全局前置守卫,在处理路由跳转前触发,怎么实现常用的全局权限校验、登录状态检查的呢?
  • 深入解析SQL多表查询:核心技巧与实战示例
  • 【前端进阶】可选链与空值合并:接口数据容错处理的最佳实践
  • 国防部:中方愿与俄方不断增强两军关系良好发展势头
  • 张涌任西安市委常委,已卸任西安市副市长职务
  • 尹锡悦涉嫌发动内乱案举行第三次庭审
  • 汇源果汁发文:经营情况一切正常
  • 韩国执政党总统候选人更换方案被否决,金文洙候选人资格即刻恢复
  • 重庆荣昌出圈背后:把网络流量变成经济发展的增量