写点什么

头脑风暴:最大子序和

  • 2022 年 8 月 21 日
    江苏
  • 本文字数:515 字

    阅读完需:约 2 分钟

头脑风暴:最大子序和

题目

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


示例:


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

解题思路

根据题意,本题可使用动态规划的方式来求解。


第一步,确定 dp 数组以及下标的含义:


dp[i]:包括下标 i 之前的最大连续子序列和为 dp[i]。


第二步,确定递推公式:


dp[i] 当且仅有两个方向可以推断:


  1. dp[i - 1] + nums[i],即:nums[i]加入当前连续子序列和

  2. nums[i],即:从头开始计算当前连续子序列和


第三步,dp 初始化:


根据 dp[i]的定义, dp[0] = nums[0]。


第四步,确定遍历顺序:


递推公式中 dp[i]依赖于 dp[i - 1]的状态,需要从前向后遍历。

代码实现

public static int maxSubArray(int[] nums) {        if (nums.length == 0) {            return 0;        }
int res = nums[0]; int[] dp = new int[nums.length]; dp[0] = nums[0]; for (int i = 1; i < nums.length; i++) { dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]); res = res > dp[i] ? res : dp[i]; } return res; }
复制代码

最后

  • 时间复杂度:O(n)

  • 空间复杂度:O(n)

发布于: 刚刚阅读数: 3
用户头像

佛系编码 2019.05.13 加入

红鲤鱼与绿鲤鱼与驴。

评论

发布
暂无评论
头脑风暴:最大子序和_数据结构_HelloWorld杰少_InfoQ写作社区