📌  相关文章
📜  Java程序查找是否存在总和为0的子数组

📅  最后修改于: 2022-05-13 01:55:39.882000             🧑  作者: Mango

Java程序查找是否存在总和为0的子数组

给定一个由正数和负数组成的数组,找出是否存在一个总和为 0 的子数组(大小至少为 1)。

例子 :

一个简单的解决方案是逐个考虑所有子数组并检查每个子数组的总和。我们可以运行两个循环:外部循环选择一个起点 i,内部循环尝试从 i 开始的所有子数组(参见this for implementation)。该方法的时间复杂度为 O(n 2 )。
我们也可以使用散列。这个想法是遍历数组并为每个元素 arr[i] 计算从 0 到 i 的元素之和(这可以简单地通过 sum += arr[i] 来完成)。如果之前已经看到过当前和,则存在一个零和数组。哈希用于存储总和值,以便我们可以快速存储总和并找出之前是否看到当前总和。
例子 :

arr[] = {1, 4, -2, -2, 5, -4, 3}

If we consider all prefix sums, we can
notice that there is a subarray with 0
sum when :
1) Either a prefix sum repeats or
2) Or prefix sum becomes 0.

Prefix sums for above array are:
1, 5, 3, 1, 6, 2, 5

Since prefix sum 1 repeats, we have a subarray
with 0 sum. 

以下是上述方法的实现。

Java
// A Java program to find 
// if there is a zero sum subarray
import java.util.HashSet;
import java.util.Set;
  
class ZeroSumSubarray 
{
    // Returns true if arr[] 
    // has a subarray with sero sum
    static Boolean subArrayExists(int arr[])
    {
        // Creates an empty hashset hs
        Set hs = new HashSet();
  
        // Initialize sum of elements
        int sum = 0;
  
        // Traverse through the given array
        for (int i = 0; i < arr.length; i++) 
        {
            // Add current element to sum
            sum += arr[i];
  
            // Return true in following cases
            // a) Current element is 0
            // b) sum of elements from 0 to i is 0
            // c) sum is already present in hash map
            if (arr[i] == 0 
                || sum == 0 
                || hs.contains(sum))
                return true;
  
            // Add sum to hash set
            hs.add(sum);
        }
  
        // We reach here only when there is
        // no subarray with 0 sum
        return false;
    }
  
    // Driver code
    public static void main(String arg[])
    {
        int arr[] = { -3, 2, 3, 1, 6 };
        if (subArrayExists(arr))
            System.out.println(
                "Found a subarray with 0 sum");
        else
            System.out.println("No Such Sub Array Exists!");
    }
}


输出
No Such Sub Array Exists!

假设我们具有良好的散列函数,允许在 O(1) 时间内进行插入和检索操作,则该解决方案的时间复杂度可以被认为是 O(n)。
空间复杂度:O(n)。这里我们需要额外的空间让 unordered_set 插入数组元素。

有关详细信息,请参阅有关查找是否存在总和为 0 的子数组的完整文章!