任何相邻子向量的最大和(《编程珠玑》)
原创
©著作权归作者所有:来自51CTO博客作者liuhaohust的原创作品,请联系作者获取转载授权,否则将追究法律责任
阅读《编程珠玑》,书中讨论了一个算法的实现效率问题,这个问题之前在某本书上见到过,但重新遇到时,却还是无法让思维发散来思考,自我反省下先。
问题描述:一个具有n个浮点数字的向量x;其输出是在输入的任何相邻子向量中找出的最大和。
输入:31,-14,59,26,-53,58,97,-93,-23,84
输出:返回的是x[2,...,6]的总和,或187.
思路一:采用三层循环,直接暴力计算,算法复杂度O(n^3)。很没技术含量,很傻很天真。
思路二:考虑到x[i,..,j]中的总和与前面已计算的x[i,...,j-1]相关,所以可快速计算总和,减少循环。复杂度为O(n^2)。
伪代码:
maxsofar=0
for i = [0,n)
sum = 0
for j = [i,n) ////此处我认为应该是[0,i],有空看看先
sum += x[j]
maxsofar = max(maxsofar,sum)
思路三:采用分治算法的思想,复杂度为O(nlogn)。
伪代码:
float maxsum3(l,u)
if(l>u)
return 0
if(l == u)
return max(0,x[l])
m = (l + u)/2
lmax = sum = 0
for (i = m; i >= l; i--)
sum += x[i]
lmax = max(lamx,sum)
rmax = sum = 0
for i =(m,u]
sum += x[i]
rmax = max(rmax,sum)
return max(lmax+rmax,maxsum3(l,m),maxsum3(m+1,u))
最初的调用方法为answer = maxsum3(0,n-1)
下一篇:我的友情链接
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
[编程题]最大和子矩阵
采用动态规划策略,python实现与C++实现等价。 Python 代码: C++ 代码:
动态规划 #include i++ ios -
子数组的最大和[算法]
题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成
c语言 算法 优化 i++ 数组 -
连续子数组的最大和
题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机
d3 i++ 数组 -
Vim--编程珠玑向量翻转
#include#includeusing namespace std;void FindNumberOfMoreTwoTimesAppear(int pI
vim 编程 #include ios 有序数组 -
【剑指offer之最大子向量和(连续子数组的最大和)】
【题目链接】:click here~~ 【题目描述】:题目1372:最大子向量和(连续子数组的最大和)时间限制:1 秒
剑指offer 数组 #include 子数组 ios