最大字段和算法:
这个算法在本学期的课程中,已经稍作了解。不过印象不够深刻。今天重新复习一下,加深理解。
最大字段和,无非就是三种情况:
①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));
}
}
第三种情况重新解释: