最大子序和算法
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
求解最大子序和,最先想到的方法是遍历所有子序列,但时间复杂度较高,所以运行耗时较长,不是最优算法
class Solution {
public int maxSubArray(int[] nums) {
int max = nums[0];
for(int i=0;i<nums.length;i++){
for(int j=i;j<nums.length;j++){
int thisSum = 0;
for(int p=i;p<=j;p++){
thisSum+=nums[p];
if(thisSum>max){
max = thisSum;
}
}
}
}
return max;
}
}
第二种方法采用了贪心算法,因为当前几项序列的和为负数的话,它一定不能被包括在最大序列中,例如,当首项为-3时,最大连续子序列肯定不会包含它,所以从第二个是开始继续判断,若首项为正数5,第二项为-2的话,由于前两项的加和为正数,所以对序列的增益有效,所以继续向下判断前三项之和,以此类推
class Solution {
public int maxSubArray(int[] nums) {
int sum = 0;
int max = nums[0];
for(int i=0;i<nums.length;i++){
sum+=nums[i];
if(sum<0){
if(sum>max){
max = sum;
}
sum=0;
}else if(sum>max){
max = sum;
}
}
return max;
}
}
这里要注意的一点是当全部都为负数时的处理,当前数为负数,但当它比上一个max(即上一个负数)大时,将max改为该负数,该算法复杂度为O(n)。
对于最大子序和下次进行补充。