连续子数组的最大和

120 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

连续子数组的最大和

题目

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

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

示例1:

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

提示:

  • 1 <= arr.length <= 10^5
  • -100 <= arr[i] <= 100

题目分析

这道题看标题就能知道需要我们做什么,需要我们求出数组中连续的子数组的最大和,这里可以使用动态规划,使用动态规划,最关键的点就是写出它的转移方程,我们在这里分析一下,如果数组的i元素结尾,前i-1的子数组的最大和大于0,显然应该是第i个数组的值与前i-1的连续子数组最大和的求和,如果前i-1的连续子数组最大和小于等于0,前i个连续子数组最大和是第i个数组项的值。

代码实现

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

这是我用java实现的功能,每个题都用不同的解法和写法,我大体整理了一下自己的思路然后就写了,也没有再想其他的方法,如果你有更好的解法,欢迎和我留言,我们一起进步,一起学习数据结构,共同进步,通过这道题能更熟悉动态规划的使用和操作。

代码写的很简洁,我们是把前i-1的值和0进行比较后直接加到第i项上的,直接在原来给定的数组的基础上修改的,节省了空间。。。

总结

这道题依旧是对动态规划的考察,动态规划的题目只要找到了对应的转移方程,思路就有了,题目自然就会迎刃而解了。所有对于动态规划来说,最重要的还是分析出转移方程来。

这道题先分析到这里,如果有不当之处,欢迎指正。