求解最大连续子数组和

本文探讨了求解连续下标子数组最大和的问题,对比了暴力遍历与动态规划算法的实现方式。暴力遍历方法通过多次循环计算所有可能的子数组和,而动态规划算法则采用更高效的策略,避免重复计算,显著提升运算速度。

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

假设有个数组 arr = [ -4,-5,-10,7,4,-12 ] , 求出连续下标子数组的最大和.

1.笨方法,暴力遍历

遍历数组,挨个求出i元素为起始的最大连续数组
arr[i] + arr[i + 1]
arr[i] + arr[i + 1] + arr[i + 2]
arr[i] + arr[i + 1] + arr[i + 2] + arr[i + 3] + …

看代码

//常规遍历
func method1(arr []int)(int , int , int){
	fmt.Println("method1>>>");
	length := len(arr);
	max := 0;
	begin , end := 0 , 0;
	step := 0;
	for i := 0; i < length ; i ++ {
		ret := 0;
		for k := 0; k < length - i ; k ++ {
			step ++;
			ret += arr[i + k]; //挨个取出相加,找出最大值
			if(ret > max){
				max = ret;
				begin = i;
				end = i + k;
			}
		}
	}
	println("step:" , step);//运行了多少次
	return begin , end , max;
}

时间复杂度为: n + (n - 1) + (n - 2) + … + (n - n)

2.动态规划算法

func method3(arr []int)(int , int , int){
	cur := arr[0];
	max := arr[0];
	for k , v := range arr {
		if(k == 0){
			continue;
		}

		if(max < cur){
			max = cur;
		}

		if(v > cur + v){
			cur = v;
		}else {
			cur = cur + v;
		}


	}

	if(max < cur){
		max = cur;
	}

	return 0 , cur , max;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值