零和最小子阵列

时间:2012-02-05 19:06:17

标签: arrays algorithm

  

可能重复:
  Zero sum SubArray

  

数组包含正元素和负元素,找到   总和等于0的子数组。

这是一个面试问题。 不幸的是,我无法阅读这个question的接受答案,所以我再次问它:如何找到零和的最小整数子阵列?

注意,这不是"零子集问题"。明显的强力解决方案是O(N ^ 2)(在所有子阵列上循环)。我们可以用O(N)来解决它吗?

2 个答案:

答案 0 :(得分:5)

此算法将全部找到它们,您可以轻松修改它以找到最小的子阵列。

给定int[] input array,您可以创建一个int[] tmp数组tmp[i] = tmp[i - 1] + input[i];,以便在tmp的每个元素处存储输入到该元素的总和。

现在,如果你检查tmp,你会注意到可能存在彼此相等的值。假设这个值在索引jk j < k处,那么总和为0的子数组将从索引j + 1k。注意:如果是j + 1 == k,那么k is 0就是这样! ;)

注意:算法应考虑虚拟tmp[-1] = 0;

实现可以通过不同的方式完成,包括使用BrokenGlass建议的HashMap,但要注意上面注意中的特殊情况。

示例:

int[] input = {4,  6,  3, -9, -5, 1, 3, 0, 2}
int[] tmp =   {4, 10, 13,  4, -1, 0, 3, 3, 5}
  • 注意索引0和3的tmp中的值4 ==&gt; sum tmp 1到3 = 0,长度(3 - 1)+ 1 = 4
  • 注意索引5的tmp中的值0 ==&gt; sum tmp 0到5 = 0,长度(5 - 0)+ 1 = 6
  • 注意索引6处的tmp中的值3和7 ==&gt; sum tmp 7到7 = 0,长度(7-7)+ 1 = 1

答案 1 :(得分:4)

  

数组包含正元素和负元素,找到   总和等于0的子数组。

是的,可以在O(n)中完成。如果子数组中元素的总和等于零,则意味着在子数组之前直到第一个元素的元素总和与直到子数组中最后一个元素的元素之和相同。

遍历数组并且对于每个元素K将总和达到K并将索引K放在哈希表中,如果当前元素的总和已经存在,则检查该元素的索引和当前元素(如果是delta)低于最小子阵列长度,更新最小值。使用(sum,current index K)更新哈希表。