package demo;
public class P66 {
//要求找到累加和最大的子数组(连续),返回最大累加和
//递推法:从左向右扫描,同时记录当前子数组的累加和arrSum、当前最大累加和maxSum。
//如果arrSum<0,说明这部分产生负面作用,所以舍弃、重新开子数组。否则继续往后加,每次增加检查是否比maxSum更大
public static void main(String[] args) {
int[] arr= {1,-2,3,5,-2,6,-1};
int[] result=findMaxSum(arr,arr.length);
System.out.println("从下标 "+result[0]+" 到 "+result[1]+" 为最大子数组 , 累加和为:"+result[2]);
}
static int[] findMaxSum(int[] arr, int n) {
int i=0;
while(arr[i]<0)
i++;
int left=i;
int arrSum=arr[i];
int right=i;
int maxSum=arrSum;
for(int j=i+1;j<n;j++) {
arrSum+=arr[j];
if(arrSum<0) {
j++;
while(arr[j]<0)
j++;
left=j; //舍弃后,重设左指针
arrSum=arr[j];
}
else if(arrSum>maxSum) {
right=j; //新的max出现,重设右指针
maxSum=arrSum;
}
}
return new int[] {left,right,maxSum};
}
}