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

剑指 Offer 42. 连续子数组的最大和

剑指 Offer 42. 连续子数组的最大和

难度:easy\color{Green}{easy}easy


题目描述

输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

要求时间复杂度为O(n)。

示例1:

输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

提示:

  • 1<=arr.length<=1051 <= arr.length <= 10^51<=arr.length<=105
  • −100<=arr[i]<=100-100 <= arr[i] <= 100100<=arr[i]<=100

注意:本题与主站 53 题相同:https://leetcode-cn.com/problems/maximum-subarray/


算法

常见解法时间复杂度
暴力搜索O(n2)O(n^2)O(n2)
分治思想O(nlogn)O(nlogn)O(nlogn)
动态规划O(n)O(n)O(n)

(动态规划)

  • 状态定义: 设动态规划列表 dpdpdpdp[i]dp[i]dp[i] 代表以元素 nums[i]nums[i]nums[i] 为结尾的连续子数组最大和。

为何定义最大和 dp[i] 中必须包含元素 nums[i] :保证 dp[i] 递推到 dp[i+1] 的正确性;如果不包含 nums[i] ,递推时则不满足题目的 连续子数组 要求。

  • 转移方程: 若 dp[i−1]≤0dp[i−1]≤0dp[i1]0 ,说明 dp[i−1]dp[i−1]dp[i1]dp[i]dp[i]dp[i] 产生负贡献,即 dp[i−1]+nums[i]dp[i−1]+nums[i]dp[i1]+nums[i] 还不如 nums[i]nums[i]nums[i] 本身大。

    • dp[i−1]>0dp[i−1]>0dp[i1]>0 时:执行 dp[i]=dp[i−1]+nums[i]dp[i]=dp[i−1]+nums[i]dp[i]=dp[i1]+nums[i]
    • dp[i−1]≤0dp[i−1]≤0dp[i1]0 时:执行 dp[i]=nums[i]dp[i]=nums[i]dp[i]=nums[i]
  • 初始状态: dp[0]=nums[0]dp[0]=nums[0]dp[0]=nums[0],即以 nums[0]nums[0]nums[0] 结尾的连续子数组最大和为 nums[0]nums[0]nums[0]

  • 返回值: 返回 dpdpdp 列表中的最大值,代表全局最大值。

在这里插入图片描述

复杂度分析

  • 时间复杂度O(n)O(n)O(n)

  • 空间复杂度 : O(1)O(1)O(1)

C++ 代码

使用 res 代表最终的答案,s 表示前 i - 1 项的值, 如果前 i - 1 项的值小于 0s 等于当前的数 num,如果大于 0, 说明可以加上当前的数字 num,继续往后运算。

class Solution {
public:int maxSubArray(vector<int>& nums) {int res = INT_MIN, s = 0;for (auto x : nums) {if (s < 0) s = 0;s += x;res = max(res, s);}return res;}
};

参考链接

http://www.lryc.cn/news/17141.html

相关文章:

  • 双指针 (C/C++)
  • CVE-2023-23752 Joomla未授权访问漏洞分析
  • 单通道说话人语音分离——Conv-TasNet(Convolutional Time-domain audio separation Network)
  • 华为OD机试真题Python实现【环中最长子串】真题+解题思路+代码(20222023)
  • Netcat安装与使用(nc)
  • 蓝桥杯:聪明的猴子
  • Spring Boot应用如何快速接入Prometheus监控
  • vscode远程调试python
  • Spring Boot 框架 集成 Knife4j(内含源代码)
  • 什么蓝牙耳机适合打游戏?打游戏不延迟的蓝牙耳机
  • 【项目设计】高并发内存池(一)[项目介绍|内存池介绍|定长内存池的实现]
  • 初识MySQL下载与安装【快速掌握知识点】
  • 如何终止一个线程
  • 上岸!选择你的隐私计算导师!
  • go gin学习记录5
  • PyQt5数据库开发2 5.1 QSqlQueryModel
  • MySQL-redo log和undo log
  • 阿里云ECS TOP性能提升超20%!KeenTune助力倚天+Alinux3达成开机即用的全栈性能调优 | 龙蜥技术
  • 华为OD机试真题Python实现【快递业务站】真题+解题思路+代码(20222023)
  • 【c语言】预处理
  • 嵌入式常用知识
  • 和平精英五曜赐福返场,老款玛莎返场来了
  • React从入门到精通二
  • 【likeshop多商户】电子面单商家直播上线啦~
  • 游戏化销售管理是什么?使用CRM系统进行有什么用?
  • Mysql 索引(三)—— 不同索引的创建方式(主键索引、普通索引、唯一键索引)
  • 秒懂算法 | 基于朴素贝叶斯算法的垃圾信息的识别
  • SpringCloud - Feign远程调用
  • Eotalk Vol.03:结合 API DaaS,让使用数据更方便
  • 从零开始学习Java编程:一份详细指南