第五十一题 最大子序和
题目描述
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
例如:
解题方法
方法一:动态规划
图解:
Java:
class Solution {
public int maxSubArray(int[] nums) {
int pre = 0, maxAns = nums[0];
for (int x : nums) {
pre = Math.max(pre + x, x);
maxAns = Math.max(maxAns, pre);
}
return maxAns;
}
}
C++: 转载
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int pre = 0, maxAns = nums[0];
for (const auto &x: nums) {
pre = max(pre + x, x);
maxAns = max(maxAns, pre);
}
return maxAns;
}
};
Python: 转载
from typing import List
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
size = len(nums)
pre = 0
res = nums[0]
for i in range(size):
pre = max(nums[i], pre + nums[i])
res = max(res, pre)
return res
方法二:贪心算法
- 若当前所指元素之前的和小于0,则丢弃当前元素之前的数列
图解:
Java:
public static int maxSubArray2(int[] nums){
int res = nums[0];
int sum = 0;
for (int num : nums) {
if (sum>0){
sum+=num;
}else{
sum=num;
}
res=Math.max(res,sum);
}
return res;
}
C++: 转载
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int result = INT32_MIN;
int count = 0;
for (int i = 0; i < nums.size(); i++) {
count += nums[i];
if (count > result) { // 取区间累计的最大值(相当于不断确定最大子序终止位置)
result = count;
}
if (count <= 0) count = 0; // 相当于重置最大子序起始位置,因为遇到负数一定是拉低总和
}
return result;
}
};
python:
def maxSubArray5(self, nums: List[int]):
max_nums = nums[0]
sum = 0
for num in nums:
sum = sum + num if sum > 0 else num
max_nums = max(max_nums, sum)
return max_nums
本文仅介绍了动态规划和贪心两种算法思路,而本题的解题方法还有很多,如暴力法、分治法和递归等,大家可自己尝试这些解法。