要求找到累加和最大的子数组(连续),返回最大累加和

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};
	}

}
posted @ 2022-05-04 19:55  fighterk  阅读(22)  评论(0)    收藏  举报