Java 最大和邻接子阵列(访谈问题)
可能重复:Java 最大和邻接子阵列(访谈问题),java,c++,c,algorithm,Java,C++,C,Algorithm,可能重复: 今天在Adobe软件工程师职位面试中,我被问到了以下问题 问题给定一个整数数组arr[1..n]。编写一个算法来查找数组中具有最大和的相邻子数组的和。如果所有数字都为负数,则返回0 示例 给定数组arr[1..6]=[12,14,0,-4,61,-39] 回答 83由[12,14,0,-4,61]构成 我可以想出一个运行在O(nlogn)中的解决方案,但我认为它不是很有效。面试官让我写一个O(n)算法。我想不出来 你知道如何为这个问题编写一个O(n)解决方案吗? 要在C/C++/J
今天在Adobe软件工程师职位面试中,我被问到了以下问题 问题给定一个整数数组
arr[1..n]
。编写一个算法来查找数组中具有最大和的相邻子数组的和。如果所有数字都为负数,则返回0
示例
给定数组arr[1..6]=[12,14,0,-4,61,-39]
回答
83由[12,14,0,-4,61]
构成
我可以想出一个运行在O(nlogn)
中的解决方案,但我认为它不是很有效。面试官让我写一个O(n)
算法。我想不出来
你知道如何为这个问题编写一个O(n)
解决方案吗?
要在C/C++/Java中实现的算法
提前感谢您可以使用在O(n)中运行的
这是算法(无耻地抄袭)
初始化:
到目前为止的最大值=0
此处的最大值=0
数组中每个元素的循环
(a) max_ending_here=max_ending_here+a[i]
(b) if(此处的最大值小于0)
此处的最大值=0
(c) 如果(最大值到目前为止<最大值到此结束)
max\u so\u far=max\u ending\u此处
返回到目前为止的最大值
这里有一个指向维基百科文章的链接供参考:这个数组怎么样:[-12,14,0,-4,61,-39]实际结果:[-12,14,0,-4,61]预期:[14,0,-4,61]在“编程珍珠”(Programming Pearls)——推荐阅读中有一整章关于这个问题。这是一个非常简单的问题。一个接一个地从两端穿过。并继续从每一端修剪阵列,直到从开始到当前位置或从结束到当前位置的总和为负值。O(n)
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