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

53. 最大的子数组和

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

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

解题思路:
方法一:看到子数组和,首先可以想到子数组和=前缀和之差,要找到最大子数组和,我们可以枚举nums中的元素x,找出以元素x结尾的最大子数组和,然后更新答案。

要寻找以元素x结尾的最大子数组和,我们只需要知道x元素之前的最小子数组和。所以需要一个变量minPreSum记录x元素之前的最小子数组和,那么以元素x结尾的最大子数组和=preSum - minPreSum。

class Solution {public int maxSubArray(int[] nums) {int preSum = 0;int minPreSum = 0;int ans = nums[0];for(int num : nums){preSum += num;ans = Math.max(ans, preSum - minPreSum);minPreSum = Math.min(minPreSum, preSum);}return ans;}
}

方法二:动态规划。要知道以x结尾的最大子数组和,我们可以通过以x-1结尾的最大子数组和推导出来。状态转移方程为dp[i] = max(dp[i-1] + nums[i], nums[i]),dp[i]表示以i结尾的最大子数组和,在枚举i的过程中更新答案。

class Solution {public int maxSubArray(int[] nums) {int n = nums.length;int[] dp = new int[n];dp[0] = nums[0];int ans = dp[0];for(int i = 1; i < n; i++){dp[i] = Math.max(dp[i-1] + nums[i], nums[i]);ans = Math.max(dp[i], ans);}return ans;}
}

优化:
因为在计算dp[i]的过程中只会用到dp[i-1],所以我们可以用一个变量来代替。

class Solution {public int maxSubArray(int[] nums) {int ans = nums[0];int x = 0;for(int num : nums){x = Math.max(x + num, num);ans = Math.max(x, ans);}return ans;}
}

相关文章:

  • 26-数据结构-顺序表1
  • go部分语法记录
  • 算法第14天|继续学习二叉树:找二叉树左下角的值、二叉树路径总和、从中序遍历与后序遍历序列构建二叉树
  • 数据结构 (树) 学习 2025年6月12日12:59:39
  • 校园网数据安全防线
  • 【力扣 简单 C】83. 删除排序链表中的重复元素
  • 浅析4D-bev标注技术在自动驾驶领域的重要性
  • python中的分支结构:单分支、多分支,switch语句
  • Haption遥操作机械臂解决方案通过高精度力反馈技术实现人机协同操作
  • 常用三款解压软件对比
  • python学习---dayday2
  • 数据库-数据查询-Like
  • Vue3+TypeScript实现解释器模式
  • Vue3+TypeScript实现责任链模式
  • 苍穹外卖Day11代码解析以及深入思考
  • 微服务架构中的 Kafka:异步通信与服务解耦(四)
  • idea2024版本设置TODO快捷键
  • 【Java开发日记】简单说一说使用 Netty 进行 Socket 编程
  • 虚拟 DOM Diff 算法详解
  • Vue 生命周期详解(重点:mounted)
  • 中国建设银行产品信息网站/刷外链
  • 企业网站制作一/长沙有实力seo优化
  • 网站可以个人备案吗/深圳华强北新闻最新消息今天
  • 网络管理系统平台/青岛seo关键词优化排名
  • 微信云开发小程序/河南网站推广优化排名
  • 网站做多宽/微信推广图片