来自两个数组的相应索引处具有相同总和的子数组的最大长度
给定两个由N个整数组成的数组A[]和B[] ,任务是找到子数组[i, j]的最大长度,使得A[i…j]的和等于B[i…j ] .
例子:
Input: A[] = {1, 1, 0, 1}, B[] = {0, 1, 1, 0}
Output: 3
Explanation: For (i, j) = (0, 2), sum of A[0… 2] = sum of B[0… 2] (i.e, A[0]+A[1]+A[2] = B[0]+B[1]+B[2] => 1+1+0 = 0+1+1 => 2 = 2). Similarly, for (i, j) = (1, 3), sum of A[1… 3] = B[1… 3]. Therefore, the length of the subarray with equal sum is 3 which is the maximum possible.
Input: A[] = {1, 2, 3, 4}, B[] = {4, 3, 2, 1}
Output: 4
方法:给定的问题可以在无序地图的帮助下使用贪婪方法来解决。可以观察到,对于一对(i, j) ,如果A[i… j]的总和 = B[i… j]的总和,则必须成立。因此,可以创建差值(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)