《编程珠玑》第八章第十题

背景题目:

给定一个整形数组,找到连续的和最大的子序列。

1. 暴力破解(O(n3)):

for i : 1 to n
	for j : i to n
		sum = 0
		for k : i to j
			sum += Array[k]
			maxSum = max(maxSum, sum)

2. 优化(O(n2)):

创建一个同样大小的整形数组,原始数组为Array1,新建的数组为Array2,Array2[i]表示以Array1[i]为结尾的所有子串中的最大和。构建方式如下:

for i to 1
		sum += Array1[i]
		maxSum = max(sum, maxSum)


3. 辅助数组:
创建一个同样大小的整形数组,原始数组为Array1,新建的数组为Array2,Array2[i]表示以Array1[i]为结尾的所有子串中的最大和。构建方式如下:

for i : 1 to n
	if(0 == i)
		Array2[i] = max(0, Array1[i]);
	else
		if(Array2[i - 1] > 0)
			Array2[i] = max(Array2[i - 1] + Array1[i], 0);
		else
			Array2[i] = max(Array1[i], 0);

原题:

假设我们想要查找的是总和最接近0的子向量,而不是具有最大总和的子向量,你能设计出的最优先的算法是什么?就可以应用到那些算法设计技术?如果我们希望查找总和最接近某一给定实数t的子向量,结果又将怎样?


解法(O(nLogn)):

创建数组Sum,Sum[i] = Array1[1] + Array[2] + ... Array[i],复杂度为O(n),此时计算子向量Array[i...j] = Sum[j] - Sum[i],要求的即为Sum中最接近的两个数;

对Sum排序,O(nLogn);

找到相邻的差值最小的,O(n)


类似的都可以考虑上述第三个算法和创建Sum数组的解题方法。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值