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

目录

题目链接: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  5for(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.rhkb.cn/news/418489.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型推理框架 RTP-LLM 架构解析

RTP-LLM 是阿里巴巴智能引擎团队推出的大模型推理框架&#xff0c;支持了包括淘宝、天猫、闲鱼、菜鸟、高德、饿了么、AE、Lazada 等多个业务的大模型推理场景。RTP-LLM 与当前广泛使用的多种主流模型兼容&#xff0c;使用高性能的 CUDA kernel, 包括 PagedAttention、FlashAtt…

Spring Boot-自定义banner

在 Spring Boot 应用中&#xff0c;你可以自定义启动时显示的 banner。这些 banner 可以包括图形、文字或者其他形式的标识。如图所示&#xff1a; 1. 使用 banner.txt 文件 默认情况下&#xff0c;Spring Boot 使用项目的 banner.txt 文件中的内容作为启动时的 banner。你可以…

会员营销如何利用JSON发送短信

在当今这个数字化时代&#xff0c;企业间的竞争日益激烈&#xff0c;如何高效地触达并维护用户群体&#xff0c;提升用户粘性和忠诚度&#xff0c;成为了每个企业都必须面对的重要课题。在众多营销手段中&#xff0c;会员营销因其精准性和个性化而备受青睐。而在会员营销的策略…

Vue学习笔记 二

4、Vue基础扩展 4.1 插槽 组件的最大特性就是复用性&#xff0c;而用好插槽能大大提高组件的可复用能力在Vue中插槽是很重要的存在&#xff0c;通过插槽&#xff0c;我们可以把父组件中指定的DOM作用到子组件的任意位置&#xff0c;后面我们坐项目用到的组件库比如element-ui…

ctfshow-nodejs

什么是nodejs Node.js 是一个基于 Chrome V8 引擎的 Javascript 运行环境。可以说nodejs是一个运行环境&#xff0c;或者说是一个 JS 语言解释器 Nodejs 是基于 Chrome 的 V8 引擎开发的一个 C 程序&#xff0c;目的是提供一个 JS 的运行环境。最早 Nodejs 主要是安装在服务器…

C语言 | Leetcode C语言题解之第391题完美矩形

题目&#xff1a; 题解&#xff1a; bool isSubsequence(char* s, char* t) {int mstrlen(s); int nstrlen(t);int k0; int j0;if(mn&&m0) return true;for(int i0;i<n;i){if(s[j]t[i]){j;}if(jm) return true;}return false; }

Mac使用Elasticsearch

下载 Past Releases of Elastic Stack Software | Elastic 解压tar -xzvf elasticsearch-8.15.1-darwin-x86_64.tar.gz 修改配置文件config/elasticsearch.yml xpack.security.enabled: false xpack.security.http.ssl: enabled: false 切换目录 cd elasticsearch-8.15.1/…

ArcGIS中怎么合并多个点图层并删除重复点?

最近&#xff0c;我接到了一个怎么合并多个点图层并删除其中的重复点的咨询。 下面是我对这个问题的解决思路&#xff1a; 1、合并图层 在地理处理工具里面 选择合并 并设置好要合并的图层即可 2、接下来在 数据管理工具→常规→删除相同项 即可 希望这些建议能对大家有所帮…

【PPT学习笔记】使用PPT制作动画/手书/视频等作品的适配性和可能性?

【PPT学习笔记】使用PPT制作动画/手书等作品的可能性&#xff1f; 背景前摇&#xff1a;&#xff08;省流可不看&#xff09; 最近找到另外一份新的实习工作&#xff0c;有很多需要用到PPT动画的地方。 然而&#xff0c;我们之前制作的理工科PPT全是摒弃了形式主义的艰苦朴素…

【LeetCode】08.字符串转换整数

题目要求 解题思路 本题没有难点&#xff0c;只需注意最大整数的比较时要切换成long long 代码实现 class Solution { public:int myAtoi(string s) {//标记正负号int flag1;long long ret0;int ns.size();int i0;//去除空格while(s[i] ) i;//识别符号if(s[i]-) flag-1;i…

链动2+1模式AI智能名片S2B2C商城小程序源码在社群商业价值构建中的应用探索

摘要&#xff1a;在数字经济浪潮的推动下&#xff0c;社群作为商业生态的核心组成部分&#xff0c;其商业价值正以前所未有的速度增长。本文深入探讨了如何通过“链动21模式AI智能名片S2B2C商城小程序源码”这一前沿技术工具&#xff0c;深度挖掘并优化社群的商业价值。通过详细…

LED显示屏维修技巧与常见问题

LED显示屏作为现代显示技术的重要组成部分&#xff0c;广泛应用于广告、信息发布、公共显示等多个领域。然而&#xff0c;随着使用时间的增长&#xff0c;LED显示屏难免会出现各种问题。本文将探讨LED显示屏维修的一些小技巧以及常见的问题&#xff0c;帮助用户更好地维护和延长…

docker进入容器运行命令

前言 Docker是一种流行的容器化平台&#xff0c;它能够快速构建、交付和运行应用程序。在使用Docker时&#xff0c;我们经常需要进入容器进行调试、管理和运行命令等操作。 进入 docker 容器需要执行以下步骤&#xff1a;打开终端窗口。使用 docker ps 命令查看正在运行的容器…

集合及映射

1、集合类图 1&#xff09;ArrayList与LinkedList 区别 LinkedList 实现了双向队列的接口&#xff0c;对于数据的插入速度较快&#xff0c;只需要修改前后的指向即可&#xff1b;ArrayList对于特定位置插入数据&#xff0c;需要移动特定位置后面的数据&#xff0c;有额外开销 …

时序预测及模型简介

1. 时序预测 时序预测是一种统计或机器学习方法&#xff0c;它尝试对历史的时序数据建模&#xff0c;以预测未来的时间点。比如股价、商超销售额、航空乘客量等。本文主要介绍时序预测的基本概念以及常用方法介绍&#xff0c;但不做展开介绍&#xff0c;后续会针对方法、模型做…

找到字符串中所有字母异位词问题

欢迎跳转我的主页&#xff1a;羑悻的小杀马特-CSDN博客 目录&#xff1a; 一题目简述&#xff1a; 二思路汇总&#xff1a; 三解答代码&#xff1a; 一题目简述&#xff1a; leetcode题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 二思路汇总&#xff1a; …

基于微信小程序在线订餐系统

微信小程序在线订餐系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了微信小程序在线订餐系统的开发全过程。通过分析微信小程序在线订餐系统管理的不足&#xff0c;创建了一个计算机管理微信小程序在线订…

【原创】java+swing+mysql简易员工管理系统设计与实现

个人主页&#xff1a;程序员杨工 个人简介&#xff1a;从事软件开发多年&#xff0c;前后端均有涉猎&#xff0c;具有丰富的开发经验 博客内容&#xff1a;全栈开发&#xff0c;分享Java、Python、Php、小程序、前后端、数据库经验和实战 文末有本人名片&#xff0c;希望和大家…

远程桌面 Rust Desk 自建服务器

因为某些原因(诈骗)&#xff0c;Rush Desk 服务已暂停国内访问&#xff0c;今天我们介绍如何利用自己的服务器搭建 Rust Desk 远程桌面&#xff0c;低延迟电脑远程手机&#xff0c;手机远程电脑等 一、准备工作 准备一台服务器&#xff0c;我用的腾讯云服务器&#xff0c;一年…

Gitlab-ce upgrade 16.0.1 to 17.3.1【Gitlab-ce 16.0.1 升级 17.3.1】

文章目录 背景gitlab-ce 16.0.1 升级 17.3.1 失败gitlab-ce 16.0.1 升级 16.11.8 失败gitlab-ce 16.0.1 升级 16.7.9 失败gitlab-ce 16.0.1 升级 16.3.8 成功gitlab-ce 16.3.8 升级 16.11.8 失败gitlab-ce 16.3.8 升级 16.7.9 成功gitlab-ce 16.7.9 升级 16.11.8 成功gitlab-ce…