【发布时间】:2016-05-14 13:36:20
【问题描述】:
简介:据我所知,SO 中还没有提出这个问题。
这是一道面试题。
我什至没有专门寻找代码解决方案,任何算法/伪代码都可以。
问题:给定一个整数数组int[] A及其大小N,找到2个非后续(数组中不能相邻)元素以最少的金额。答案也不能包含第一个或最后一个元素(索引0 和n-1)。解决方案也应该是O(n)时间和空间复杂度。
例如当A = [5, 2, 4, 6, 3, 7] 时,答案是5,因为2+3=5。
当A = [1, 2, 3, 3, 2, 1] 时,答案是4,因为2+2=4 并且您不能选择1 中的任何一个,因为它们位于数组的末尾。
尝试:起初我认为解决方案中的一个数必须是数组中最小的一个(除了第一个最后),但这很快就被反例驳斥了A = [4, 2, 1, 2, 4]-> 4 (2+2)
然后我想如果我在数组中找到 2 个最小的数字(除了第一个和最后一个),那么解决方案就是这两个。这显然很快就失败了,因为我不能选择 2 个相邻的数字,如果我必须选择不相邻的数字,那么这就是问题的定义:)。
最后我想,好吧,我会在数组中找到 3 个最小的数字(除了第一个和最后一个),并且解决方案必须是两个其中,因为其中两个必须彼此不相邻。
这也由于A = [2, 2, 1, 2, 4, 2, 6]-> 2+1=3而失败,这似乎有效,因为我会找到2, 1, 2,但假设我在索引1, 2, 3中找到2, 1, 2这不会必须工作(如果我在索引5 中专门找到了2 就可以了,但不幸的是我不能保证)。
问题: 现在我很困惑,谁能想出一个可行的解决方案/想法?
【问题讨论】:
-
你确定它可以在 O(n) 时间内解决吗?
-
如何修改三个最小数字的方法以包含索引。您将需要 6 个位置来存储 - 3 个索引、3 个值。如果您看到重复值,则只需更新索引,以便在您的示例中看到索引“5”处的“2”时,第二个索引可以更新为 5,从而将“2”和“5”处的元素作为解决方案在同一个过程中。只要确保仅在被跟踪的索引已经相邻时更新重复索引即可。
-
只是为了确保我理解这个问题,a) A = {1,2,2,2,1} 的答案是 4 ? b) 数组的最小长度是 5?
-
您可能可以使用Kadane's algorithm 的变体来解决这个问题。
-
@higuaro,我认为它需要很多变化,因为该算法严重依赖于相邻的选定元素,这里的要求是相反的。
标签: java arrays algorithm time-complexity minimum