力扣最热一百题——最大子数组和

news2024/12/25 22:29:14

目录

题目链接:53. 最大子数组和 - 力扣(LeetCode)

题目描述

示例

提示:

解法一:动态规划

举例分析

时间复杂度

Java写法:

C++写法:

优化

总结


题目链接:53. 最大子数组和 - 力扣(LeetCode)

注:下述题目描述和示例均来自力扣

题目描述

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

子数组

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

示例

示例 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

提示:

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


解法一:动态规划

  1. 初始化

    • 首先,获取数组 nums 的长度 len
    • 新建一个数组 ap,这个数组用于存储到达每个索引 i 时,包含该元素的最大连续子数组和。
    • 初始化 ap[0]nums[0],因为第一个元素的最大子数组和只能是它本身。
    • 初始化 resap[0],用来存储最终的最大子数组和。
  2. 动态规划计算

    • i = 1 开始遍历整个数组:
      • 对于每个 i,计算 ap[i]
        • ap[i - 1] + nums[i] 表示将当前元素 nums[i] 加入到前一个位置 i-1 的最大子数组和中。
        • nums[i] 表示不加前面的子数组,直接以当前元素 nums[i] 作为新子数组的开始。
        • 取两者中的较大值作为 ap[i],表示在 i 位置时的最大子数组和。
      • 更新 res 为当前最大值,res = Math.max(res, ap[i])
  3. 返回结果

    • 最后,返回 res,即数组中最大子数组和。

举例分析

假设 nums = [-2,1,-3,4,-1,2,1,-5,4],每一步的计算如下:

  • i = 0ap[0] = -2res = -2
  • i = 1ap[1] = max(-2 + 1, 1) = 1res = max(-2, 1) = 1
  • i = 2ap[2] = max(1 + -3, -3) = -2res = max(1, -2) = 1
  • i = 3ap[3] = max(-2 + 4, 4) = 4res = max(1, 4) = 4
  • i = 4ap[4] = max(4 + -1, -1) = 3res = max(4, 3) = 4
  • i = 5ap[5] = max(3 + 2, 2) = 5res = max(4, 5) = 5
  • i = 6ap[6] = max(5 + 1, 1) = 6res = max(5, 6) = 6
  • i = 7ap[7] = max(6 + -5, -5) = 1res = max(6, 1) = 6
  • i = 8ap[8] = max(1 + 4, 4) = 5res = max(6, 5) = 6

最终结果为 6,即最大子数组和是 [4, -1, 2, 1],和为 6

时间复杂度

  • 时间复杂度为 O(n),因为我们只需要遍历数组一次。
  • 空间复杂度为 O(n),因为我们使用了额外的 dp 数组来存储每一步的计算结果。

Java写法:

class Solution {
    public int maxSubArray(int[] nums) {

        int len = nums.length;
        // 新建一个dp数组
        // dp[i]表示索引0到i这个位置的最大连续子数组的值
       int[] ap = new int[len] ;
       // 初始化dp数组
       ap[0] = nums[0];

       int res = ap[0];   

       // -2,1,-3,4,-1,2,1,-5,4
       // -2-1 -3 4 3  5 6 1  5
       for(int i = 1;i < len;i++){
        // 如果当前位置的值加上前一个位置的最大连续子数组的和大就要这个
        // 否则就存入当前位置的值
        ap[i] = Math.max(ap[i - 1] + nums[i],nums[i]);
        // 更新res的值
        res = Math.max(res,ap[i]);
       }
       return res;
    }
}

C++写法:

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int len = nums.size();
        // 定义出dp数组
        vector<int> dp(len);
        // 初始化
        dp[0] = nums[0];
        int res = dp[0];
        for(int i = 1;i < len; i++){
            dp[i] = max(dp[i - 1] + nums[i],nums[i]);
            res = max(res,dp[i]);
        }
        return res;
    }
};


优化

        这里其实我们每次只需要一个之前存储的值,因此我们完全不需要使用数组来存储全部的值,我们只需要每次维护i-1的位置的值就行了。

Java:

class Solution {
    public int maxSubArray(int[] nums) {
       int dp = nums[0];
       int res = dp;   
       for(int i = 1;i < nums.length;i++){
        dp = Math.max(dp + nums[i],nums[i]);
        // 更新res的值
        res = Math.max(res,dp);
       }
       return res;
    }
}

打败了全世界的人!!!!!!!!!!!!! 

C++:

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int dp = nums[0];
        int res = dp;
        for(int i = 1;i < nums.size(); i++){
            dp = max(dp + nums[i],nums[i]);
            res = max(res,dp);
        }
        return res;
    }
};


总结

        

        这段代码实现了求解数组最大子数组和的问题,通过动态规划的方式逐步计算包含每个元素的最大子数组和。主要步骤包括:

  1. 初始化:创建一个数组 ap,存储每个位置的最大子数组和,并初始化第一个元素的值。

  2. 动态规划:遍历数组,每次计算当前元素的最大子数组和,比较当前值与加入前一个位置最大和后的值,选择较大者存入 ap。同时,更新全局最大值 res

  3. 返回结果:最终返回最大子数组和 res

时间复杂度为 O(n),空间复杂度为 O(n)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2114225.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

「数学::质数」试除法 / Luogu P5736(C++)

概述 在质数的第一节我们来讲解试除法。 质数是指在大于1的自然数中只能被1和它自己整除的数。 我们可以利用这一除法性质对质数进行判定。 Luogu P5736&#xff1a; 输入 n 个不大于 10^5 的正整数。要求全部储存在数组中&#xff0c;去除掉不是质数的数字&#xff0c;依…

012.Oracle-索引

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群

828华为云征文&#xff5c;华为云Flexus X实例docker部署rancher并构建k8s集群 华为云最近正在举办828 B2B企业节&#xff0c;Flexus X实例的促销力度非常大&#xff0c;特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求&#xff0c;一定…

Differential Diffusion,赋予每个像素它应有的力量,以及在comfyui中的测试效果

&#x1f97d;原论文要点 首先是原论文地址&#xff1a;https://differential-diffusion.github.io/paper.pdf 其次是git介绍地址&#xff1a;GitHub - exx8/differential-diffusion 感兴趣的朋友们可以自行阅读。 首先&#xff0c;论文开篇就给了一个例子&#xff1a; 我们的方…

SpringBoot2:请求处理原理分析-RESTFUL风格接口

一、RESTFUL简介 Rest风格支持&#xff08;使用HTTP请求方式&#xff0c;动词来表示对资源的操作&#xff09; 以前&#xff1a;/getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveUser 保存用户 现在&#xff1a; /user GET-获取用户 DELETE-删除用户 PUT-修改…

自定义TextView实现结尾加载动画

最近做项目&#xff0c;仿豆包和机器人对话的时候&#xff0c;机器人返回数据是流式返回的&#xff0c;需要在文本结尾添加加载动画&#xff0c;于是自己实现了自定义TextView控件。 源码如下&#xff1a; import android.content.Context import android.graphics.Canvas imp…

Java小程序案例:电子日历记事本

要点 菜单栏中提供编辑&#xff08;剪切、复制、粘贴&#xff09;、保存、打开等功能。使用类组件实现图形界面设计。基于图形界面的日历&#xff0c;用户可编辑或查看指定日期的日志内容。提供按钮实现月份的前后翻动。事件持久化到文件&#xff0c;可再次编辑保存 效果 程序…

【工具】使用 Jackson 实现优雅的 JSON 格式化输出

说明 在 Java 开发中&#xff0c;我们经常需要处理 JSON 数据。无论是从服务器端返回的数据&#xff0c;还是本地存储的数据&#xff0c;JSON 格式都因其轻量级和易于解析的特点而被广泛使用。当我们需要查看或调试 JSON 数据时&#xff0c;优雅、格式化的输出将大大提高我们的…

风控系统之指标回溯,历史数据重跑

个人博客&#xff1a;无奈何杨&#xff08;wnhyang&#xff09; 个人语雀&#xff1a;wnhyang 共享语雀&#xff1a;在线知识共享 Github&#xff1a;wnhyang - Overview 回顾 默认你已经看过之前那篇风控系统指标计算/特征提取分析与实现01&#xff0c;Redis、Zset、模版方…

C++万字解读类和对象(上)

1.类的定义 class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后面分号不能省略。类体中内容称为类的成员&#xff1a;类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。 为了区分成员变量&…

SprinBoot+Vue应急信息管理系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

远心镜头选型公式

在当今的机器视觉领域&#xff0c;远心镜头凭借其独特的远心光路设计以及超低畸变、高远心度和高景深等特点&#xff0c;成为尺寸测量和视觉对位中的得力工具。然而&#xff0c;如何进行快速而准确的选型呢&#xff1f;答案就在于选型公式&#xff1a;倍率 焦距 N.A.Sensor 尺…

移动端视频编辑SDK解决方案,AI语音识别添加字幕

对于众多Vlog创作者而言&#xff0c;繁琐的字幕添加过程往往成为提升内容质量的绊脚石。为了彻底改变这一现状&#xff0c;美摄科技凭借其深厚的AI技术积累与创新的移动端视频编辑SDK解决方案&#xff0c;推出了革命性的AI语音识别添加字幕功能&#xff0c;让视频创作更加高效、…

再论大模型做内容消费

前言 今天咱们再体验几个有关大模型聚集内容创作的工作。 之前也专门介绍过一些大模型在该方面的工作&#xff0c;感兴趣的小伙伴可以穿梭&#xff1a;《提升大模型内容创作能力》&#xff1a;https://zhuanlan.zhihu.com/p/716240950 废话不多说&#xff0c;一起来看看吧&a…

【技术调研】三维(0)-webGL、三维基础知识、前置知识、数学知识以及简单示例

前言 ​ 因业务需要了解网页端三维相关技术,故对webGL相关技术学习并记录。旨在了解网页端三维的基本原理。 什么是webGL? ​ WebGL全称叫做Web Graphics Library,它是JavaScript API。用于在任何兼容的Web浏览器中渲染交互式的3D图形,并且无需使用插件。它基于 OpenGL …

参会邀请 | 第二届机器视觉、图像处理与影像技术国际会议(MVIPIT 2024)

第二届机器视觉、图像处理与影像技术国际会议&#xff08;MVIPIT 2024&#xff09;将于2024年9月13日-15日在中国张家口召开。 MVIPIT 2024聚焦机器视觉、图像处理与影像技术&#xff0c;旨在为专家、学者和研究人员提供一个国际平台&#xff0c;分享研究成果&#xff0c;讨论…

上海大学《2022年836+915自动控制原理真题及答案》 (完整版)

Part1&#xff1a;2022年上海大学真题题目 学硕836 专硕915 Part2&#xff1a;2022年上海大学真题答案 学硕836 专硕915

Linux学习之路 -- 线程概念

本文主要介绍线程的相关概念与基础控制 什么是线程&&线程的相关知识 按照书本上的定义&#xff0c;线程就是进程内部的一个执行分支&#xff0c;而线程是cpu调度的基本单位。 如果直接按照书本上的定义理解&#xff0c;线程这个概念是比较模糊的&#xff0c;而且我们…

013.Python爬虫系列_re正则解析

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈 PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈 Oracle数…

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

BAPI作为SAP中的重要概念&#xff0c;在SAP系统的开发中几乎是必须的。 本章来学习一下BAPI 的直观印象&#xff0c;以及在ABAP代码中的调用。 目录 1&#xff0c; BAPI概述 1&#xff0c;从画面角度来直观体验一下BAPI 1-1&#xff0c;MM&#xff1a;購買依頼変更BAPI - …