最大和连续子数组(面试问题)[重复]
Posted
技术标签:
【中文标题】最大和连续子数组(面试问题)[重复]【英文标题】:Largest sum contiguous subarray (Interview Question) [duplicate] 【发布时间】:2011-03-21 13:32:23 【问题描述】:可能重复:Find the maximum interval sum in a list of real numbers.
今天在 Adobe 面试软件工程师职位时,我被问到以下问题。
问题给定一个整数数组arr[1..n]
。编写一个算法,求和最大的数组中连续子数组的和。如果所有数字都是负数,则返回 0。
示例
给定数组arr[1..6] = [ 12, 14, 0, -4, 61, -39 ]
回答
83 用[ 12, 14, 0, -4, 61 ]
构造。
我可以想出一个在O(n logn)
中运行的解决方案,但我认为它不是很有效。面试官让我写一个O(n)
算法。我想不出来。
知道如何为这个问题编写O(n)
解决方案吗?
在 C/C++/Java 中实现的算法。
提前致谢
【问题讨论】:
《Programming Pearls》里有一整章讲这个问题——推荐阅读。 这是一个很简单的问题。从两端一一遍历。并继续从每一端修剪数组,直到从开始到当前位置或从结束到当前位置的总和为负。 O(n) 【参考方案1】:您可以使用在 O(n) 中运行的 Kadane's algorithm。
这是算法(无耻地抄袭here)
Initialize:
max_so_far = 0
max_ending_here = 0
Loop for each element of the array
(a) max_ending_here = max_ending_here + a[i]
(b) if(max_ending_here < 0)
max_ending_here = 0
(c) if(max_so_far < max_ending_here)
max_so_far = max_ending_here
return max_so_far
【讨论】:
这里是***文章的链接供参考:en.wikipedia.org/wiki/Maximum_subarray_problem 这个数组怎么样:[ -12, 14, 0, -4, 61, -39 ] 实际结果:[ -12, 14, 0, -4, 61] 预期:[14, 0, -4, 61]以上是关于最大和连续子数组(面试问题)[重复]的主要内容,如果未能解决你的问题,请参考以下文章