应用滑动窗口法:
重点:须要存储以后滑动窗口的和,如果<=0,就不须要在它的根底上加上以后值
public int FindGreatestSumOfSubArray(int[] array) { //滑动窗口法: if(array==null || array.length==0) return -1; int max=Integer.MIN_VALUE;//存储最大值,初始化为极小值 int tempSum=0; //以后滑动窗口的和 for(int i=0;i<array.length;i++){ if(tempSum<=0){//以后滑动窗口的和<=0,则不须要在它的根底上加第i项 tempSum=array[i]; } else{ tempSum+=array[i]; } if(tempSum>max) max=tempSum; } return max;}
易错点:(下面的tempSum就是此处的preSum),preSum的更新基于最大值,这种思路是谬误的!!!
public int FindGreatestSumOfSubArray(int[] array) { //动静规划法 if(array==null || array.length==0) return -1; int preSum=0;//前一次的后果 int realSum=Integer.MIN_VALUE;//后一次的后果 for(int i=0;i<array.length;i++){ preSum = Math.max(array[i], realSum + array[i]); realSum = Math.max(realSum, preSum); } return realSum;}
起因剖析:最大和的更新基于上次的最大和,然而上次的最大和与array[i]之间不肯定间断,也就是说间接相加可能会跳过两头的一些值。
示例:数组[1,-5,5] 谬误计划求出的最大和是6,理论后果应该是5