给定一个正整数k和两个阵列A []和B []距离范围由M和N的正整数的[1,K]分别任务是从范围内最小化阵列元件的更换的由值的计数[ 1, K]使得两个数组的元素之和变得相等。如果不可能使总和相等,则打印-1 。
例子:
Input: K = 6, A[] = {3, 4, 1}, B[] = {6, 6, 6}
Output: 2
Explanation:
One of the possible way is to replace elements of array B[] at indexes 0 and 1 with 1 in two moves. Therefore, the array B[] modifies to {1, 1, 6}.
Now, the sum of both the arrays is 8, which is equal.
Input: A[] = {4, 3, 2}, B[] = {2, 3, 3, 1}, K = 6, N = 4, M = 3
Output: 0
方法:可以使用两点技术解决给定的问题。请按照以下步骤解决问题:
- 初始化 4 个变量,比如l1 = 0, r1 = M – 1, l2 = 0, r2 = N – 1 ,用于遍历数组。
- 初始化一个变量,比如res ,以存储所需的最小替换次数。
- 按升序对两个给定数组进行排序。
- 找出两个数组之和的差值并将其存储在一个变量中,例如diff 。
- 迭代直到l1 ≤ r1或l2 ≤ r2并执行以下步骤:
- 如果 diff = 0:跳出循环。
- 如果 diff 超过 0:取(A[r1] – 1)和(K – B[l2])之间的最大值并将其从差异diff 中减去,然后增加l2 ,如果(K – B[l2]) 的值更伟大。否则,将r1减一。
- 否则,取(B[r2] – 1)和(K – A[l1])之间的最大值并将其添加到差异diff 中,然后增加l1 ,如果(K – A[l1])更大。否则,将r2的值减1 。
- 将res的值增加1 。
- 完成上述步骤后,将res的值打印为所需的数组元素的最小替换次数。
下面是上述方法的实现:
C++
#include
using namespace std;
// Function to find minimum number
// of replacements required to make
// the sum of two arrays equal
int makeSumEqual(vector a, vector b,
int K, int M, int N)
{
// Stores the sum of a[]
int sum1 = 0;
// Stores the sum of b[]
int sum2 = 0;
// Calculate sum of the array a[]
for (int el : a)
sum1 += el;
// Calculate sum of the array b[]
for (int el : b)
sum2 += el;
// Stores the difference
// between a[] and b[]
int diff = sum1 - sum2;
// Left and Right pointer
// to traverse the array a[]
int l1 = 0, r1 = M - 1;
// Left and Right pointer
// to traverse the array b[]
int l2 = 0, r2 = N - 1;
// Stores the count of moves
int res = 0;
// Sort the arrays in
// ascending order
sort(a.begin(),a.end());
sort(b.begin(),b.end());
// Iterate while diff != 0 and
// l1 <= r1 or l2 <= r2
while (l1 <= r1 || l2 <= r2)
{
if (diff == 0)
{
break;
}
// If diff is greater than 0
if (diff > 0)
{
// If all pointers are valid
if (l2 <= r2 && l1 <= r1)
{
if (K - b[l2] < a[r1] - 1) {
int sub = min(
a[r1] - 1, diff);
diff -= sub;
a[r1] -= sub;
r1--;
}
else {
int sub = min(
K - b[l2], diff);
diff -= sub;
b[l2] += sub;
l2++;
}
}
// Otherwise, if only pointers
// of array a[] is valid
else if (l1 <= r1) {
int sub = min(
a[r1] - 1, diff);
diff -= sub;
a[r1] -= sub;
r1--;
}
// Otherwise
else {
int sub = min(
K - b[l2], diff);
diff -= sub;
b[l2] += sub;
l2++;
}
}
// If diff is less than 0
else {
// If all pointers are valid
if (l1 <= r1 && l2 <= r2) {
if (K - a[l1]
< b[r2] - 1) {
int sub = min(
b[r2] - 1,
-1 * diff);
diff += sub;
b[r2] -= sub;
r2--;
}
else {
int sub = min(
K - a[l1],
-1 * diff);
diff += sub;
a[l1] -= sub;
l1++;
}
}
// Otherwise, if only pointers
// of array a[] is valid
else if (l2 <= r2) {
int sub
= min(
b[r2] - 1,
-1 * diff);
diff += sub;
b[r2] -= sub;
r2--;
}
// Otherwise
else {
int sub = min(
K - a[l1], diff);
diff += sub;
a[l1] += sub;
l1++;
}
}
// Increment count
// of res by one
res++;
}
// If diff is 0, then return res
if (diff == 0)
return res;
// Otherwise, return -1
else
return -1;
}
// Driver Code
int main()
{
vector A = { 1, 4, 3 };
vector B = { 6, 6, 6 };
int M = A.size();
int N = B.size();
int K = 6;
cout << makeSumEqual(A, B, K,M, N);
return 0;
}
// This code is contributed by mohit kumar 29.
Java
// Java program for the above approach
import java.util.*;
class GFG {
// Function to find minimum number
// of replacements required to make
// the sum of two arrays equal
public static int makeSumEqual(
int[] a, int[] b, int K,
int M, int N)
{
// Stores the sum of a[]
int sum1 = 0;
// Stores the sum of b[]
int sum2 = 0;
// Calculate sum of the array a[]
for (int el : a)
sum1 += el;
// Calculate sum of the array b[]
for (int el : b)
sum2 += el;
// Stores the difference
// between a[] and b[]
int diff = sum1 - sum2;
// Left and Right pointer
// to traverse the array a[]
int l1 = 0, r1 = M - 1;
// Left and Right pointer
// to traverse the array b[]
int l2 = 0, r2 = N - 1;
// Stores the count of moves
int res = 0;
// Sort the arrays in
// ascending order
Arrays.sort(a);
Arrays.sort(b);
// Iterate while diff != 0 and
// l1 <= r1 or l2 <= r2
while (l1 <= r1 || l2 <= r2) {
if (diff == 0) {
break;
}
// If diff is greater than 0
if (diff > 0) {
// If all pointers are valid
if (l2 <= r2 && l1 <= r1) {
if (K - b[l2] < a[r1] - 1) {
int sub = Math.min(
a[r1] - 1, diff);
diff -= sub;
a[r1] -= sub;
r1--;
}
else {
int sub = Math.min(
K - b[l2], diff);
diff -= sub;
b[l2] += sub;
l2++;
}
}
// Otherwise, if only pointers
// of array a[] is valid
else if (l1 <= r1) {
int sub = Math.min(
a[r1] - 1, diff);
diff -= sub;
a[r1] -= sub;
r1--;
}
// Otherwise
else {
int sub = Math.min(
K - b[l2], diff);
diff -= sub;
b[l2] += sub;
l2++;
}
}
// If diff is less than 0
else {
// If all pointers are valid
if (l1 <= r1 && l2 <= r2) {
if (K - a[l1]
< b[r2] - 1) {
int sub = Math.min(
b[r2] - 1,
-1 * diff);
diff += sub;
b[r2] -= sub;
r2--;
}
else {
int sub = Math.min(
K - a[l1],
-1 * diff);
diff += sub;
a[l1] -= sub;
l1++;
}
}
// Otherwise, if only pointers
// of array a[] is valid
else if (l2 <= r2) {
int sub
= Math.min(
b[r2] - 1,
-1 * diff);
diff += sub;
b[r2] -= sub;
r2--;
}
// Otherwise
else {
int sub = Math.min(
K - a[l1], diff);
diff += sub;
a[l1] += sub;
l1++;
}
}
// Increment count
// of res by one
res++;
}
// If diff is 0, then return res
if (diff == 0)
return res;
// Otherwise, return -1
else
return -1;
}
// Driver Code
public static void main(String[] args)
{
int[] A = { 1, 4, 3 };
int[] B = { 6, 6, 6 };
int M = A.length;
int N = B.length;
int K = 6;
System.out.println(
makeSumEqual(A, B, K,
M, N));
}
}
C#
// C# program to implement
// the above approach
using System;
public class GFG
{
// Function to find minimum number
// of replacements required to make
// the sum of two arrays equal
public static int makeSumEqual(
int[] a, int[] b, int K,
int M, int N)
{
// Stores the sum of a[]
int sum1 = 0;
// Stores the sum of b[]
int sum2 = 0;
// Calculate sum of the array a[]
foreach (int el in a)
sum1 += el;
// Calculate sum of the array b[]
foreach (int el in b)
sum2 += el;
// Stores the difference
// between a[] and b[]
int diff = sum1 - sum2;
// Left and Right pointer
// to traverse the array a[]
int l1 = 0, r1 = M - 1;
// Left and Right pointer
// to traverse the array b[]
int l2 = 0, r2 = N - 1;
// Stores the count of moves
int res = 0;
// Sort the arrays in
// ascending order
Array.Sort(a);
Array.Sort(b);
// Iterate while diff != 0 and
// l1 <= r1 or l2 <= r2
while (l1 <= r1 || l2 <= r2) {
if (diff == 0) {
break;
}
// If diff is greater than 0
if (diff > 0) {
// If all pointers are valid
if (l2 <= r2 && l1 <= r1) {
if (K - b[l2] < a[r1] - 1) {
int sub = Math.Min(
a[r1] - 1, diff);
diff -= sub;
a[r1] -= sub;
r1--;
}
else {
int sub = Math.Min(
K - b[l2], diff);
diff -= sub;
b[l2] += sub;
l2++;
}
}
// Otherwise, if only pointers
// of array a[] is valid
else if (l1 <= r1) {
int sub = Math.Min(
a[r1] - 1, diff);
diff -= sub;
a[r1] -= sub;
r1--;
}
// Otherwise
else {
int sub = Math.Min(
K - b[l2], diff);
diff -= sub;
b[l2] += sub;
l2++;
}
}
// If diff is less than 0
else {
// If all pointers are valid
if (l1 <= r1 && l2 <= r2) {
if (K - a[l1]
< b[r2] - 1) {
int sub = Math.Min(
b[r2] - 1,
-1 * diff);
diff += sub;
b[r2] -= sub;
r2--;
}
else {
int sub = Math.Min(
K - a[l1],
-1 * diff);
diff += sub;
a[l1] -= sub;
l1++;
}
}
// Otherwise, if only pointers
// of array a[] is valid
else if (l2 <= r2) {
int sub
= Math.Min(
b[r2] - 1,
-1 * diff);
diff += sub;
b[r2] -= sub;
r2--;
}
// Otherwise
else {
int sub = Math.Min(
K - a[l1], diff);
diff += sub;
a[l1] += sub;
l1++;
}
}
// Increment count
// of res by one
res++;
}
// If diff is 0, then return res
if (diff == 0)
return res;
// Otherwise, return -1
else
return -1;
}
// Driver Code
public static void Main(String[] args)
{
int[] A = { 1, 4, 3 };
int[] B = { 6, 6, 6 };
int M = A.Length;
int N = B.Length;
int K = 6;
Console.WriteLine(
makeSumEqual(A, B, K,
M, N));
}
}
Javascript
输出:
2
时间复杂度: O(N)
辅助空间: O(1)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。