精选力扣500题 第29题 LeetCode 53. 最大子序和c++ / java 详细题解

Posted 林深时不见鹿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了精选力扣500题 第29题 LeetCode 53. 最大子序和c++ / java 详细题解相关的知识,希望对你有一定的参考价值。

1、题目

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

示例 1:

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

示例 2:

输入:nums = [1]
输出:1

示例 3:

输入:nums = [0]
输出:0

示例 4:

输入:nums = [-1]
输出:-1

示例 5:

输入:nums = [-100000]
输出:-100000

提示:

  • 1 <= nums.length <= 3 * 104
  • -105 <= nums[i] <= 105

2、思路

(动态规划) O ( n ) O(n) O(n)

状态表示: f[i]表示以num[i]结尾的连续子数组的和的最大值

集合划分: 将集合划分为只有nums[i]一个数,和以nums[i]为结尾的多个数组成的连续子数组两大类

状态计算: f[i] = max(nums[i], f[i - 1] + nums[i] )

图示
在这里插入图片描述

3、c++代码

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int res = nums[0];
        for(int i = 1; i < nums.size(); i++)
        {
            nums[i] = max(nums[i], nums[i-1] + nums[i]);
            res = max(res,nums[i]);
        }
        return res;
    }
};

4、java代码

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

原题链接53. 最大子序和
在这里插入图片描述

以上是关于精选力扣500题 第29题 LeetCode 53. 最大子序和c++ / java 详细题解的主要内容,如果未能解决你的问题,请参考以下文章

精选力扣500题 第20题 LeetCode 704. 二分查找c++详细题解

精选力扣500题 第8题 LeetCode 160. 相交链表 c++详细题解

精选力扣500题 第61题 LeetCode 78. 子集c++/java详细题解

精选力扣500题 第6题 LeetCode 912. 排序数组c++详细题解

精选力扣500题 第21题 LeetCode 42. 接雨水c++详细题解

精选力扣500题 第14题 LeetCode 92. 反转链表 IIc++详细题解