C++程序:查找是否存在子数组的总和为0
给定正数和负数的数组,请查找是否存在大小至少为1的子数组其总和为0。
例子:
输入: {4, 2, -3, 1, 6}
输出: true
说明:
从索引1到3存在总和为0的子数组。
输入: {4, 2, 0, 1, 6}
输出 : true
说明:
从索引2到2存在总和为0的子数组。
输入: {-3, 2, 3, 1, 6}
输出: false
_练习 _
一个 简单的解决方案 是逐个考虑所有子数组,并检查每个子数组的总和。我们可以运行两个循环:外循环选择一个起始点i,内循环从i开始尝试所有子数组(实现请参见此处)。该方法的时间复杂度为O(n 2 )。
我们还可以 使用哈希 。想法是通过数组进行迭代,并为每个元素arr[i]计算从0到i的元素的总和(可以简单地处理为sum + = arr [i])。如果当前总和已经在之前存在,则存在零和数组。使用哈希存储总和值,以便我们可以快速存储总和并找出当前总和是否在先前存在。
例子:
以下是上述方法的实现。
输出
时间复杂度 假设我们拥有良好的哈希函数,允许插入和检索操作的时间为O(1),则此解决方案的时间复杂度可以视为O(n)。
空间复杂度 :O(n)。这里我们需要额外的空间来插入数组元素的unordered_set。
有关更多详细信息,请参阅 Find if there is a subarray with 0 sum 的完整文章!