📌  相关文章
📜  来自两个数组的相应索引处具有相同总和的子数组的最大长度

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

来自两个数组的相应索引处具有相同总和的子数组的最大长度

给定两个由N个整数组成的数组A[]B[] ,任务是找到子数组[i, j]的最大长度,使得A[i…j]的和等于B[i…j ] .

例子:

方法:给定的问题可以在无序地图的帮助下使用贪婪方法来解决。可以观察到,对于一对(i, j) ,如果A[i… j]的总和 = B[i… j]的总和,则\sum_{x=i}^{j} (A[x] - B[x]) = 0        必须成立。因此,可以创建差值(A[x] – B[x])的前缀和数组。可以观察到,前缀和数组中的重复值表示两个重复值之间的子数组之和必须为 0。因此,在变量maxSize中跟踪此类子数组的最大大小,这将是必需的回答。

下面是上述方法的实现:

C++
// C++ program for the above approach
#include "bits/stdc++.h"
using namespace std;
 
// Function to find maximum length of subarray
// of array A and B having equal sum
int maxLength(vector& A, vector& B)
{
    int n = A.size();
 
    // Stores the maximum size of valid subarray
    int maxSize = 0;
 
    // Stores the prefix sum of the difference
    // of the given arrays
    unordered_map pre;
    int diff = 0;
    pre[0] = 0;
 
    // Traverse the given array
    for (int i = 0; i < n; i++) {
 
        // Add the difference of the
        // corresponding array element
        diff += (A[i] - B[i]);
 
        // If current difference is not present
        if (pre.find(diff) == pre.end()) {
            pre = i + 1;
        }
 
        // If current difference is present,
        // update the value of maxSize
        else {
            maxSize = max(maxSize, i - pre + 1);
        }
    }
 
    // Return the maximum length
    return maxSize;
}
 
// Driver Code
int main()
{
    vector A = { 1, 2, 3, 4 };
    vector B = { 4, 3, 2, 1 };
 
    cout << maxLength(A, B);
 
    return 0;
}


Java
// Java program for the above approach
import java.util.HashMap;
class GFG {
 
    // Function to find maximum length of subarray
    // of array A and B having equal sum
    public static int maxLength(int[] A, int[] B) {
        int n = A.length;
 
        // Stores the maximum size of valid subarray
        int maxSize = 0;
 
        // Stores the prefix sum of the difference
        // of the given arrays
        HashMap pre = new HashMap();
        int diff = 0;
        pre.put(0, 0);
 
        // Traverse the given array
        for (int i = 0; i < n; i++) {
 
            // Add the difference of the
            // corresponding array element
            diff += (A[i] - B[i]);
 
            // If current difference is not present
            if (!pre.containsKey(diff)) {
                pre.put(diff, i + 1);
            }
 
            // If current difference is present,
            // update the value of maxSize
            else {
                maxSize = Math.max(maxSize, i - pre.get(diff));
            }
        }
 
        // Return the maximum length
        return maxSize;
    }
 
    // Driver Code
    public static void main(String args[]) {
        int[] A = { 1, 2, 3, 4 };
        int[] B = { 4, 3, 2, 1 };
 
        System.out.println(maxLength(A, B));
 
    }
}
 
// This code is contributed by gfgking.


Python3
# python program for the above approach
 
# Function to find maximum length of subarray
# of array A and B having equal sum
 
 
def maxLength(A,  B):
 
    n = len(A)
 
    # Stores the maximum size of valid subarray
    maxSize = 0
 
    # Stores the prefix sum of the difference
    # of the given arrays
    pre = {}
    diff = 0
    pre[0] = 0
 
    # Traverse the given array
    for i in range(0, n):
 
        # Add the difference of the
        # corresponding array element
        diff += (A[i] - B[i])
 
        # If current difference is not present
        if (not (diff in pre)):
            pre = i + 1
 
        # If current difference is present,
        # update the value of maxSize
        else:
            maxSize = max(maxSize, i - pre + 1)
 
    # Return the maximum length
    return maxSize
 
 
# Driver Code
if __name__ == "__main__":
 
    A = [1, 2, 3, 4]
    B = [4, 3, 2, 1]
 
    print(maxLength(A, B))
 
# This code is contributed by rakeshsahni


C#
// C# program for the above approach
using System;
using System.Collections.Generic;
 
class GFG{
 
    // Function to find maximum length of subarray
    // of array A and B having equal sum
    public static int maxLength(int[] A, int[] B) {
        int n = A.Length;
 
        // Stores the maximum size of valid subarray
        int maxSize = 0;
 
        // Stores the prefix sum of the difference
        // of the given arrays
        Dictionary pre =
                new Dictionary();
                 
        int diff = 0;
        pre.Add(0, 0);
 
        // Traverse the given array
        for (int i = 0; i < n; i++) {
 
            // Add the difference of the
            // corresponding array element
            diff += (A[i] - B[i]);
 
            // If current difference is not present
            if (!pre.ContainsKey(diff)) {
                pre.Add(diff, i + 1);
            }
 
            // If current difference is present,
            // update the value of maxSize
            else {
                maxSize = Math.Max(maxSize, i - pre[(diff)]);
            }
        }
 
        // Return the maximum length
        return maxSize;
    }
 
// Driver Code
public static void Main()
{
    int[] A = { 1, 2, 3, 4 };
    int[] B = { 4, 3, 2, 1 };
 
    Console.Write(maxLength(A, B));
}
}
 
// This code is contributed by sanjoy_62.


Javascript



输出
3

时间复杂度: O(N)
辅助空间: O(N)