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

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 @   fighterk  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示