最大和连续子数组(面试问题)[重复]

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.

今天在 Adob​​e 面试软件工程师职位时,我被问到以下问题。

问题给定一个整数数组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]

以上是关于最大和连续子数组(面试问题)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

面试题31 连续子数组的最大和

剑指offer面试题42. 连续子数组的最大和

剑指offer面试题42. 连续子数组的最大和

最强解析面试题:连续子数组的最大和

面试题:连续子数组的最大和

动态规划:面试题42. 连续子数组的最大和