数组系列—连加和最大子数组

本文介绍了两种求解最大子数组和的方法:穷举法和动态规划。穷举法通过遍历所有可能的子数组来找到最大和,时间复杂度为O(n²)。动态规划方法利用子问题间的关联性降低复杂度,通过更新中间结果来实现更高效的求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、穷举法

	穷举法:
		例:
			 1 -2 4  3  -1  -4
		j=0  1-4找最大子序列、保存下标start、end
		j=1  -2-4..
		j=2   4-4..  
		.
		j=5
	此算法遍历了所有情况、时间复杂度为O(n2)
	
	public void find(int[] array){
		int maxSum=array[0];
		int currentSum=0;
		int start=0;//记录最大值的开始与结尾
		int end=0;
		for(int i=0;i<array.length;i++){
			for(int j=i;j<array.length;j++){
				currentSum+=array[j];
				if(currentSum>maxSum){
					maxSum=currentSum;
					start=i;
					end=j;
				}
				currentSum=0;
			}
		}
		for(int i=start;i<=end;i++){
			System.out.print(array[i]);
			if(i!=end){
				System.out.print(",");
			}
		}
	}

2、动态规划

	例:
			 1 -2 4  3  -1  -4
		
		sum	 1 -1 4  7  6   2
	
	思路:动态归化时将问题化解为几个相互关联的问题、分解复杂度。
		 若sum[i-1]>0,则最大值为sum[i]=sum[i-1]+array[i]
					 否则为sum[i]=array[i]并更新start。
		 判断lastSum与maxSum,更新end
	public static void find(int[] array){
		int lastSum=0;
		int maxSum=array[0];
		int start=0;
		int end=0;
		for(int i=0;i<array.length;i++){
			//lastSum最大和
			if(lastSum>0){
				lastSum=lastSum+array[i];
			}else{
				lastSum=array[i];
				start=i;
			}
			//若大于则更新
			if(maxSum<lastSum){
				maxSum=lastSum;
				end=i;
			}
		}
		for(int i=start;i<=end;i++){
			System.out.print(array[i]);
			if(i!=end){
				System.out.print(",");
			}
		}
	}

	F(i)=max(F(i-1+array[i] , array[i]) 
		res:所有子数组的和的最大值 
		res=max(res,F(i)) 
		如数组[6, -3, -2, 8, -15, 1, 2, 2] 
		初始状态: 
		    F(0=6 
		    res=6 
		i=1: 
		    F(1=max(F(0-3-3=max(6-33=3 
		    res=max(F(1),res)=max(36=6 
		i=2: 
		    F(2=max(F(1-2-2=max(3-2-2=1 
		    res=max(F(2),res)=max(16=6 
		i=3: 
		    F(3=max(F(2+77=max(1+77=8 
		    res=max(F(2),res)=max(86=8 
		i=4: 
		    F(4=max(F(3-15-15=max(8-15-15=-7 
		    res=max(F(4),res)=max(-78=8 

	public int FindGreatestSumOfSubArray(int[] array) {
        int res=array[0];
        int max=array[0];
        for(int i=1;i<array.length;i++){
            max=Math.max(max+array[i],array[i]);
            res=Math.max(max,res);
        }
        return res;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值