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

Leetcode——53. 最大子数组和

遇到连续子数组和问题,可以试着从前缀和入手。求出前缀和后,发现其实就是每个位置的前缀和减去之前前缀和的最小值,最后得到差的最大值即可。

class Solution {
public:int maxSubArray(vector<int>& nums) {int sum = 0;int minSum = 0;int ans = INT_MIN;for(int x : nums){sum += x;ans = max(ans, sum - minSum);minSum = min(minSum, sum);}return ans;}
};

不过,在此基础上也可以观察到,该问题是可以分解为小范围的子问题。从第一个数字入手,没添加一个新数字,最大连续子数组的和要么连上该数字,要么就以该数字为新的起点。所以动态规划代码如下:

class Solution {
public:int maxSubArray(vector<int>& nums) {int n = nums.size();vector<int> dp(n, -1);dp[0] = nums[0];int ans = dp[0];for(int i = 1; i < n; i++){dp[i] = max(dp[i - 1] + nums[i], nums[i]);// 或// dp[i] = max(dp[i - 1], 0) + nums[0];ans = max(ans, dp[i]);}// 注, 答案不是dp[n - 1]// 而是整个dp数组的最大值return ans;}
};

空间优化:

class Solution {
public:int maxSubArray(vector<int>& nums) {int n = nums.size();//vector<int> dp(n, -1);//dp[0] = nums[0];int f = nums[0];int ans = f;for(int i = 1; i < n; i++){//dp[i] = max(dp[i - 1] + nums[i], nums[i]);f = max(f, 0) + nums[i];// 或// dp[i] = max(dp[i - 1], 0) + nums[i];ans = max(ans, f);}// 注, 答案不是dp[n - 1]// 而是整个dp数组的最大值return ans;}
};

http://www.dtcms.com/a/309232.html

相关文章:

  • 如何将消息转移到新 iPhone
  • 如何将联系人从三星手机转移到 iPhone
  • MySQL 高并发下如何保证事务提交的绝对顺序?
  • 转换图(State Transition Diagram)和时序图(Sequence Diagram)画图流程图工具
  • 新手向:国内外大模型体验与评测
  • 智能图书馆管理系统开发实战系列(四):后端C++ DLL开发与模块化设计
  • 一种新的分布式ID生成方案--ULID
  • ABP VNext + Dapr Workflows:轻量级分布式工作流
  • (AC)唐克的新游戏
  • Vue3中Markdown解析与渲染的完整解决方案:从安全到性能优化
  • PostgreSQL 中删除指定数据库下的所有表结构
  • 微服务的编程测评系统9-竞赛新增-竞赛编辑
  • 如何保护 Redis 实例的安全?
  • 快速排序算法详解与洛谷例题实战
  • 【PHP 构造函数与析构函数:从基础到高级的完整指南】
  • 直播平台中的美白滤镜实现:美颜SDK的核心架构与性能优化指南
  • Qt结合ffmpeg实现图片参数调节/明亮度对比度饱和度设置/滤镜的使用
  • Windows编译安装ffmpeg和sdl
  • CG--逻辑判断1
  • 实战指南:如何将Git仓库中的特定文件夹及其历史完整迁移到另一个仓库
  • Git 各场景使用方法总结
  • java8学习笔记-Stream流
  • 在uni-app中引入本地日志插件
  • 城市数字孪生之GISBox三维顶层重建白皮书
  • 操作系统:共享内存通信(Shared Memory Systems)
  • WAIC 2025再发AI十大展望
  • WaitForSingleObject 函数参数影响及信号处理分析
  • SpringAI智能客服Function Calling兼容性问题解决方案
  • 中国信通院/华为:智能体技术和应用研究报告(2025)(转载)
  • 充电桩与照明“联动”创新:智慧灯杆破解新能源基建难题