LeetCode 53. Maximum Subarray

Find the contiguous subarray within an array (containing at least one number) which has the largest sum.

For example, given the array [-2,1,-3,4,-1,2,1,-5,4],
the contiguous subarray [4,-1,2,1] has the largest sum = 6.

方法一:
解题思路:
sum: 初始值是数组的第一个元素,找到第一个正数后,再给sum赋初值,然后指针向后移,保证sum的和大于0
maxsum: 存放最大的子数组和,初值先赋值为第一个元素值
首先找到第一个正数,在找正数的过程中,将最大的复数赋值给maxsum,这样就可以保证数组全负时,maxsum仍然是最大值。
如果找到了正数,则先将第一个正数的值赋值给sum,每次加上一个正的数组元素时,都对sum和maxsum进行判断,保存最大值,如果加上了一个负的数组元素,但sum还是为正数,就直接将数组元素累计在sum中,如果加上负的数组元素后,sum小于等于0,先sum和maxsum的值进行判断,保存最大的值,然后指针再向后移,判断出现的第一个正数,并和maxsum比较,以防后面的元素拉低了第一个出现正数的值。
public class Solution {
    public int maxSubArray(int[] nums) {
        int lastpos;
        int sum=nums[0],maxsum=nums[0];
        int i=0;
        while(i<nums.length){
            if(nums[i]<=0){
                if(nums[i]>maxsum){
                    maxsum=nums[i];   //记录下最大的非正数数值
                }
                i++;
            }else{
                sum = nums[i];
                maxsum=maxsum>sum?maxsum:sum;
                break;    //找到了第一个正数
            }
        }
        if(i<nums.length){  //说明数组中有正数
            i++;
            while(i<nums.length){
                if(sum+nums[i]>0 && nums[i]<=0){
                    sum =sum + nums[i];
                    i++;
                }else if(nums[i]>0){
                    sum =sum + nums[i];
                    maxsum=maxsum>sum?maxsum:sum; 
                    i++;
                }else{
                    maxsum=maxsum>sum?maxsum:sum; 
                    i++;
                    while(i<nums.length && nums[i]<=0){ //找到第一个正数
                        i++;
                    }
                    if(i>=nums.length){
                        return maxsum;
                    }else{
                        sum=nums[i];
                        maxsum=maxsum>sum?maxsum:sum;
                        i++; 
                    }
                    
                }
                
            }
        
        }
       // maxsum=maxsum>sum?maxsum:sum;
        return maxsum;
    }
}
方法二:
解题思路:
sum:从下标0开始累加元素的和,每累加一个元素,就和max比较一下。(先和max比较,因为max也有可能是负数,如果先判断sum是否小于等于0,这时sum的值已经改变了)。然后再看sum是否小于等于0,(当所有元素为负数时,每个元素都和max进行了比较),如果是,则表示前面这段累加没有作用,舍弃了前面的元素的累加结果为0的情况,重新开始累积。
max:存放最大子数组的和


class Solution {
    public int maxSubArray(int[] nums) {
        int max = nums[0];
        int sum = 0;
        int len = nums.length;
        for(int i = 0; i<len;i++){
            sum += nums[i];
            if(sum > max){
                max = sum;
            }
            if(sum <=0){
                sum = 0;
            }
                        
        }
        return max;
    }
}              
 

确定最大子数组的起始点下标:

class Solution {
    public int maxSubArray(int[] nums) {
        int max = nums[0];
        int maxleft = 0, maxright = 0;
        int sum = 0;
        int left = 0, right = 0;
        int len = nums.length;
        for(int i = 0; i<len;i++){
            sum += nums[i];
            if(sum > max){
                max = sum;
                maxleft=left;
                maxright = right;
                
            }
            if(sum <=0){
                sum = 0;
                left=i+1;
                right=i+1;
                
            }else{
                right+=1;
            }
                        
        }
        return max;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值