精选力扣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++详细题解