53. Maximum Subarray(最大子数组和)
题目大意
Given an integer array nums
, find the subarray with the largest sum, and return its sum.
中文释义
给定一个整数数组 nums
,找出具有最大和的子数组,并返回其和。
示例
- 示例 1:
- 输入:
nums = [-2,1,-3,4,-1,2,1,-5,4]
- 输出:
6
- 解释:子数组
[4,-1,2,1]
有最大的和 6。
- 输入:
- 示例 2:
- 输入:
nums = [1]
- 输出:
1
- 解释:子数组
[1]
有最大的和 1。
- 输入:
- 示例 3:
- 输入:
nums = [5,4,-1,7,8]
- 输出:
23
- 解释:子数组
[5,4,-1,7,8]
有最大的和 23。
- 输入:
限制条件
1 <= nums.length <= 10^5
-10^4 <= nums[i] <= 10^4
进阶
如果你已经实现了 O(n) 时间复杂度的解法,尝试使用更微妙的分治法来编写另一种解法。
解题思路
使用动态规划(DP)来解决问题。通过维护一个当前子数组的最大和和全局的最大和来找出最大子数组和。
步骤说明
- 初始化一个变量
current_sum
来存储当前子数组的和,以及一个变量max_sum
来存储迄今为止的最大子数组和。 - 遍历数组
nums
的每个元素:- 更新
current_sum
为当前元素和当前元素加上current_sum
中的较大者。 - 更新
max_sum
为current_sum
和max_sum
中的较大者。
- 更新
- 返回
max_sum
作为最大子数组和的结果。
代码
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int current_sum = 0, max_sum = INT_MIN;
for (int num : nums) {
current_sum = max(current_sum + num, num);
max_sum = max(current_sum, max_sum);
}
return max_sum;
}
};