两个数组中的最大和路径

给定两个排序的数组,这样这些数组可能有一些公共元素。求从任意数组开始到任意两个数组结束的最大和路径之和。我们只能在公共元素处从一个数组切换到另一个数组。 注: 公共元素不必位于相同的索引中。

null

预期时间复杂度:O(m+n) ,其中m是ar1[]中的元素数,n是ar2[]中的元素数。

例如:

Input: ar1[] = {2, 3, 7, 10, 12}       ar2[] = {1, 5, 7, 8}Output: 35Explanation: 35 is sum of 1 + 5 + 7 + 10 + 12.We start from the first element of arr2 which is 1, then wemove to 5, then 7.  From 7, we switch to ar1 (as 7 is common)and traverse 10 and 12.Input: ar1[] = {10, 12}       ar2 = {5, 7, 9}Output: 22Explanation: 22 is the sum of 10 and 12.Since there is no common element, we need to take all elements from the array with more sum.Input: ar1[] = {2, 3, 7, 10, 12, 15, 30, 34}        ar2[] = {1, 5, 7, 8, 10, 15, 16, 19}Output: 122Explanation: 122 is sum of 1, 5, 7, 8, 10, 12, 15, 30, 34

有效方法: 这个想法是做一些类似于合并过程的事情 合并排序 。这涉及计算两个数组的所有公共点之间的元素之和。只要有一个共同点,就比较这两个和,并将两个和中的最大值相加。

算法 :

  1. 创建一些变量, 后果 , sum1 , sum2 .将结果初始化为0。同时将两个变量sum1和sum2初始化为0。这里,sum1和sum2分别用于存储ar1[]和ar2[]中元素的总和。这些总和介于两个共同点之间。
  2. 现在运行一个循环来遍历两个数组的元素。遍历时,按以下顺序比较数组1和数组2的当前元素。
    1. 如果当前元素 数组1 小于当前的元素 阵列2 ,然后更新 sum1 ,否则如果当前元素 阵列2 更小,然后更新 sum2 .
    2. 如果当前元素 数组1 阵列2 相同,然后取sum1和sum2的最大值,并将其添加到结果中。还要将公共元素添加到结果中。
    3. 这一步可以比作两个步骤的合并 分类 数组中,如果处理两个当前数组索引中的最小元素,则可以保证,如果存在任何公共元素,将一起处理。因此,可以处理两个公共元素之间的元素之和。

以下是上述代码的实现:

C++

// C++ program to find maximum sum path
#include <iostream>
using namespace std;
// Utility function to find maximum of two integers
int max( int x, int y) { return (x > y) ? x : y; }
// This function returns the sum of elements on maximum path
// from beginning to end
int maxPathSum( int ar1[], int ar2[], int m, int n)
{
// initialize indexes for ar1[] and ar2[]
int i = 0, j = 0;
// Initialize result and current sum through ar1[] and
// ar2[].
int result = 0, sum1 = 0, sum2 = 0;
// Below 3 loops are similar to merge in merge sort
while (i < m && j < n)
{
// Add elements of ar1[] to sum1
if (ar1[i] < ar2[j])
sum1 += ar1[i++];
// Add elements of ar2[] to sum2
else if (ar1[i] > ar2[j])
sum2 += ar2[j++];
else // we reached a common point
{
// Take the maximum of two sums and add to
// result
//Also add the common element of array, once
result += max(sum1, sum2) + ar1[i];
// Update sum1 and sum2 for elements after this
// intersection point
sum1 = 0;
sum2 = 0;
//update i and j to move to next element of each array
i++;
j++;
}
}
// Add remaining elements of ar1[]
while (i < m)
sum1 += ar1[i++];
// Add remaining elements of ar2[]
while (j < n)
sum2 += ar2[j++];
// Add maximum of two sums of remaining elements
result += max(sum1, sum2);
return result;
}
// Driver code
int main()
{
int ar1[] = { 2, 3, 7, 10, 12, 15, 30, 34 };
int ar2[] = { 1, 5, 7, 8, 10, 15, 16, 19 };
int m = sizeof (ar1) / sizeof (ar1[0]);
int n = sizeof (ar2) / sizeof (ar2[0]);
// Function call
cout << "Maximum sum path is "
<< maxPathSum(ar1, ar2, m, n);
return 0;
}


JAVA

// JAVA program to find maximum sum path
class MaximumSumPath
{
// Utility function to find maximum of two integers
int max( int x, int y) { return (x > y) ? x : y; }
// This function returns the sum of elements on maximum
// path from beginning to end
int maxPathSum( int ar1[], int ar2[], int m, int n)
{
// initialize indexes for ar1[] and ar2[]
int i = 0 , j = 0 ;
// Initialize result and current sum through ar1[]
// and ar2[].
int result = 0 , sum1 = 0 , sum2 = 0 ;
// Below 3 loops are similar to merge in merge sort
while (i < m && j < n)
{
// Add elements of ar1[] to sum1
if (ar1[i] < ar2[j])
sum1 += ar1[i++];
// Add elements of ar2[] to sum2
else if (ar1[i] > ar2[j])
sum2 += ar2[j++];
// we reached a common point
else
{
// Take the maximum of two sums and add to
// result
//Also add the common element of array, once
result += max(sum1, sum2) + ar1[i];
// Update sum1 and sum2 for elements after this
// intersection point
sum1 = 0 ;
sum2 = 0 ;
//update i and j to move to next element of each array
i++;
j++;
}
}
// Add remaining elements of ar1[]
while (i < m)
sum1 += ar1[i++];
// Add remaining elements of ar2[]
while (j < n)
sum2 += ar2[j++];
// Add maximum of two sums of remaining elements
result += max(sum1, sum2);
return result;
}
// Driver code
public static void main(String[] args)
{
MaximumSumPath sumpath = new MaximumSumPath();
int ar1[] = { 2 , 3 , 7 , 10 , 12 , 15 , 30 , 34 };
int ar2[] = { 1 , 5 , 7 , 8 , 10 , 15 , 16 , 19 };
int m = ar1.length;
int n = ar2.length;
// Function call
System.out.println(
"Maximum sum path is :"
+ sumpath.maxPathSum(ar1, ar2, m, n));
}
}
// This code has been contributed by Mayank Jaiswal


Python3

# Python program to find maximum sum path
# This function returns the sum of elements on maximum path from
# beginning to end
def maxPathSum(ar1, ar2, m, n):
# initialize indexes for ar1[] and ar2[]
i, j = 0 , 0
# Initialize result and current sum through ar1[] and ar2[]
result, sum1, sum2 = 0 , 0 , 0
# Below 3 loops are similar to merge in merge sort
while (i < m and j < n):
# Add elements of ar1[] to sum1
if ar1[i] < ar2[j]:
sum1 + = ar1[i]
i + = 1
# Add elements of ar2[] to sum2
elif ar1[i] > ar2[j]:
sum2 + = ar2[j]
j + = 1
else : # we reached a common point
# Take the maximum of two sums and add to result
result + = max (sum1, sum2) + ar1[i]
#update sum1 and sum2 to be considered fresh for next elements
sum1 = 0
sum2 = 0
#update i and j to move to next element in each array
i + = 1
j + = 1
# Add remaining elements of ar1[]
while i < m:
sum1 + = ar1[i]
i + = 1
# Add remaining elements of b[]
while j < n:
sum2 + = ar2[j]
j + = 1
# Add maximum of two sums of remaining elements
result + = max (sum1, sum2)
return result
# Driver code
ar1 = [ 2 , 3 , 7 , 10 , 12 , 15 , 30 , 34 ]
ar2 = [ 1 , 5 , 7 , 8 , 10 , 15 , 16 , 19 ]
m = len (ar1)
n = len (ar2)
# Function call
print ( "Maximum sum path is" , maxPathSum(ar1, ar2, m, n))
# This code is contributed by __Devesh Agrawal__


C#

// C# program for Maximum Sum Path in
// Two Arrays
using System;
class GFG {
// Utility function to find maximum
// of two integers
static int max( int x, int y) { return (x > y) ? x : y; }
// This function returns the sum of
// elements on maximum path from
// beginning to end
static int maxPathSum( int [] ar1, int [] ar2, int m,
int n)
{
// initialize indexes for ar1[]
// and ar2[]
int i = 0, j = 0;
// Initialize result and current
// sum through ar1[] and ar2[].
int result = 0, sum1 = 0, sum2 = 0;
// Below 3 loops are similar to
// merge in merge sort
while (i < m && j < n) {
// Add elements of ar1[] to sum1
if (ar1[i] < ar2[j])
sum1 += ar1[i++];
// Add elements of ar2[] to sum2
else if (ar1[i] > ar2[j])
sum2 += ar2[j++];
// we reached a common point
else {
// Take the maximum of two sums and add to
// result
// Also add the common element of array,
// once
result += max(sum1, sum2) + ar1[i];
// Update sum1 and sum2 for elements after
// this intersection point
sum1 = 0;
sum2 = 0;
// update i and j to move to next element of
// each array
i++;
j++;
}
}
// Add remaining elements of ar1[]
while (i < m)
sum1 += ar1[i++];
// Add remaining elements of ar2[]
while (j < n)
sum2 += ar2[j++];
// Add maximum of two sums of
// remaining elements
result += max(sum1, sum2);
return result;
}
// Driver code
public static void Main()
{
int [] ar1 = { 2, 3, 7, 10, 12, 15, 30, 34 };
int [] ar2 = { 1, 5, 7, 8, 10, 15, 16, 19 };
int m = ar1.Length;
int n = ar2.Length;
// Function call
Console.Write( "Maximum sum path is :"
+ maxPathSum(ar1, ar2, m, n));
}
}
// This code is contributed by nitin mittal.


PHP

<?php
// PHP Program to find Maximum Sum
// Path in Two Arrays
// This function returns the sum of
// elements on maximum path
// from beginning to end
function maxPathSum( $ar1 , $ar2 , $m , $n )
{
// initialize indexes for
// ar1[] and ar2[]
$i = 0;
$j = 0;
// Initialize result and
// current sum through ar1[]
// and ar2[].
$result = 0;
$sum1 = 0;
$sum2 = 0;
// Below 3 loops are similar
// to merge in merge sort
while ( $i < $m and $j < $n )
{
// Add elements of
// ar1[] to sum1
if ( $ar1 [ $i ] < $ar2 [ $j ])
$sum1 += $ar1 [ $i ++];
// Add elements of
// ar2[] to sum2
else if ( $ar1 [ $i ] > $ar2 [ $j ])
$sum2 += $ar2 [ $j ++];
// we reached a
// common point
else
{
// Take the maximum of two sums and add to
// result
//Also add the common element of array, once
$result += max( $sum1 , $sum2 ) + $ar1 [ $i ];
// Update sum1 and sum2 for elements after this
// intersection point
$sum1 = 0;
$sum2 = 0;
//update i and j to move to next element of each array
$i ++;
$j ++;
}
}
// Add remaining elements of ar1[]
while ( $i < $m )
$sum1 += $ar1 [ $i ++];
// Add remaining elements of ar2[]
while ( $j < $n )
$sum2 += $ar2 [ $j ++];
// Add maximum of two sums
// of remaining elements
$result += max( $sum1 , $sum2 );
return $result ;
}
// Driver Code
$ar1 = array (2, 3, 7, 10, 12, 15, 30, 34);
$ar2 = array (1, 5, 7, 8, 10, 15, 16, 19);
$m = count ( $ar1 );
$n = count ( $ar2 );
// Function call
echo "Maximum sum path is "
, maxPathSum( $ar1 , $ar2 , $m , $n );
// This code is contributed by anuj_67.
?>


Javascript

<script>
// Javascript program to find maximum sum path
// Utility function to find maximum of two integers
function max(x, y)
{
return (x > y) ? x : y;
}
// This function returns the sum of elements
// on maximum path from beginning to end
function maxPathSum(ar1, ar2, m, n)
{
// Initialize indexes for ar1[] and ar2[]
let i = 0, j = 0;
// Initialize result and current sum
// through ar1[] and ar2[].
let result = 0, sum1 = 0, sum2 = 0;
// Below3 loops are similar to
// merge in merge sort
while (i < m && j < n)
{
// Add elements of ar1[] to sum1
if (ar1[i] < ar2[j])
sum1 += ar1[i++];
// Add elements of ar2[] to sum2
else if (ar1[i] > ar2[j])
sum2 += ar2[j++];
// We reached a common point
else
{
// Take the maximum of two sums and add to
// result
//Also add the common element of array, once
result += Math.max(sum1, sum2) + ar1[i];
// Update sum1 and sum2 for elements after this
// intersection point
sum1 = 0;
sum2 = 0;
//update i and j to move to next element of each array
i++;
j++;
}
}
// Add remaining elements of ar1[]
while (i < m)
sum1 += ar1[i++];
// Add remaining elements of ar2[]
while (j < n)
sum2 += ar2[j++];
// Add maximum of two sums of
// remaining elements
result += Math.max(sum1, sum2);
return result;
}
// Driver code
let ar1 = [ 2, 3, 7, 10, 12, 15, 30, 34 ];
let ar2 = [ 1, 5, 7, 8, 10, 15, 16, 19 ];
let m = ar1.length;
let n = ar2.length;
// Function call
document.write( "Maximum sum path is " +
maxPathSum(ar1, ar2, m, n));
// This code is contributed by Mayank Tyagi
</script>


输出

Maximum sum path is 122

复杂性分析 :

  • 空间复杂性: O(1)。 不需要任何额外的空间,因此空间复杂度是恒定的。
  • 时间复杂性: O(m+n)。 在while循环的每次迭代中,都会处理来自两个数组中任意一个的元素。共有m+n元素。因此,时间复杂度为O(m+n)。

本文由 皮尤斯·古普塔 。如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请发表评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享