最大字段和算法

最大字段和算法:

这个算法在本学期的课程中,已经稍作了解。不过印象不够深刻。今天重新复习一下,加深理解。

最大字段和,无非就是三种情况:

①MAX在左半部分

②MAX在右半部分

③MAX在中间

①②均可以使用递归来解决,情况三也并不是很复杂。先附上代码,然后逐条解释。

public class Solution
{
    public int maxSubArray(int[] nums) 
    {
       if(nums.length==0)
       {
            return 0; 
       }
        return helper(nums,0,nums.length-1);
    }
    public int helper(int[] nums, int left, int right)
    {
        //做第一步判断
        if(left>=right)
        {
            return nums[left];
        }
        //接下来分别考虑左右两部分,递归方法进行解决
        int mid=left+(right-left)/2;
        int leftmax=helper(nums,left,mid-1);
        int rightmax=helper(num//,mid+1,right);
        //接下来记录中间值mid,中间值单独留出来即可,留作第三种情况进行处理
        int max=nums[mid];
        //暂存max,之所已暂存,只是为了方便
        int t=max;
        //接下来考虑第三种情况
        for(int i=mid-1;i>=left;i--)
        {	
            t+=nums[i];//将每一个数组元素都和t相加,也就是和nums[mid]相加
            max=Math.max(t,max);//并判断加和后是否大于原来的值,大于则赋新值,小于保留原来的值,进行下一个
        }
        //第二次暂存max
        t=max;
        for(int i=mid+1;i<=right;i++)
        {//同上
            t+=nums[i];
            max=Math.max(t,max);
        }
        return Math.max(max,Math.max(leftmax,rightmax));
    }
}

第三种情况重新解释:



猜你喜欢

转载自blog.csdn.net/qq_36251958/article/details/76472984