Input: [-2,1,-3,4,-1,2,1,-5,4]
Output: 6
因为[4,-1,2,1] 加和最大6。
设置一个变量为当前加和, 另一个为加和的最大值, 初始值都为数组的第一个数
def maxSubArray(self, nums: List[int]) -> int:
if len(nums)==0:
return nums[0]
cur_sum=max_sum=nums[0]
for n in nums[1:]:
cur_sum = max(n,cur_sum+n)
max_sum = max(cur_sum,max_sum)
return max_sum
下面是Java版本, 和上面同理
class Solution {
public int maxSubArray(int[] nums) {
if (nums.length == 1) {
return nums[0];
}
int maxSum=nums[0],curSum=nums[0];
for (int i : Arrays.copyOfRange(nums, 1, nums.length)) {
curSum = Math.max(i,curSum+i);
maxSum = Math.max(maxSum, curSum);
}
return maxSum;
}
}
觉得上面的不好理解, 于是有了下面的, 如果都是正数的话, 可以一直累加, 只有当存在负数时, 会出现是否继续往下加还是从当前开始加, 用nums[i]>nums[i]+curSum来判断是否加和为负数
class Solution {
public int maxSubArray(int[] nums) {
if (nums.length == 1) {
return nums[0];
}
int curSum = nums[0], maxSum = nums[0];
for (int i = 1; i < nums.length; i++) {
if (nums[i] > curSum+nums[i]) {//curSum+nums[i]<nums[i]证明前面的加和是负数
curSum = nums[i];
} else {
curSum += nums[i];
}
maxSum = Math.max(maxSum, curSum);
}
return maxSum;
}
}
时间复杂度O(n)
|ू・ω・` )