时间:2018.6.11
LeeCode53
53. 最大子序和
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入:[-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
方法一、
由于数组是连续数组,连着遍历数组,首先记录数组的起始值nums[0],判断下一个值nums[1],当该值大于0时,累加上对当前的求和有帮组;当该值小于0时,累加上并不能使当前的求和有所增加;所以当nums[1] > 0时,进行累加;当nums[1]<0时,直接截断,从当前值开始,以此类推。并且一直比较max和当前的求和值sum,保证max一直记录最大的那个值。
C++,python,java的代码如下:
一、C++
classSolution {
public:
int maxSubArray(vector<int>&nums) {
int len = nums.size();
if(len == 0)
{
return 0;
}
int sum = nums[0];
int max = nums[0];
for(int i = 1; i < len; i++)
{
if(sum >= 0)
{
sum += nums[i];
}
else
{
sum = nums[i];
}
max = (max > sum) ? max :sum;
}
return max;
}
};
二、python3
classSolution:
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
l = len(nums)
if(l <= 0):
return 0
max = nums[0]
sum = nums[0]
for i in range(1,l):
if sum > 0:
sum += nums[i]
else:
sum = nums[i]
if max < sum:
max = sum
return max
三、java
classSolution {
public int maxSubArray(int[] nums) {
int len = nums.length;
if(len == 0)
{
return 0;
}
int max = nums[0];
int sum = nums[0];
for(int i = 1; i < len; i++)
{
if(sum > 0)
{
sum += nums[i];
}
else
{
sum = nums[i];
}
max = (max > sum) ? max : sum;
}
return max;
}
}
方法二、动态规划法
下一次的求和只有两种可能: dp+nums[i]、nums[i], 这样就形成了一种规则,即在两者中取大。这种方法的时间复杂度为O(n),空间复杂度为O(1),C++、python、java代码如下:
1、C++
classSolution {
public:
int maxSubArray(vector<int>&nums) {
int l = nums.size();
if(l <= 0)
{
return 0;
}
int result = nums[0];
int dp = nums[0];
for(int i = 1; i < l; i++)
{
dp = max(dp+nums[i], nums[i]);
result = max(result, dp);
}
return result;
}
};
2、python3
classSolution:
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
l = len(nums)
if l <= 0:
return 0
maxnum = nums[0]
dp = nums[0]
for i in range(1,l):
dp = max(dp + nums[i], nums[i])
maxnum = max(maxnum, dp)
return maxnum
3、java
class Solution {
public int maxSubArray(int[] nums) {
int l = nums.length;
if(l <= 0)
{
return 0;
}
int maxum = nums[0];
int dp = nums[0];
for(int i = 1; i < l; i++)
{
dp = Math.max(dp + nums[i],nums[i]);
maxum = Math.max(maxum, dp);
}
return maxum;
}
}
后续分治法。