【问题标题】:Minimum number of operations to make two arrays equal使两个数组相等的最小操作数
【发布时间】:2022-10-23 13:14:36
【问题描述】:

给定 2 个整数数组,一个,对数组 B 的操作定义如下:

B[i] = B[i]+2B[j] = B[j]-2, 在哪里我!= j

  • i 和 j 可以是任意索引,可以进行上述操作 任意次数使得 i 和 j 不相等

  • 有效的操作由加法和减法步骤组成,这两部分都是强制性的

如果所有元素的频率相同,则认为数组相等,数组不需要排序,找到所需的最小操作

输入:
A = [ 2, 10, 14 ]

B = [ 6, 2, 18 ]

输出:2

解释 :

1st operation:  select i=0; j=2; 
B[i] += 2 i.e B[0]=8;
B[j] -= 2 i.e B[2] = 16;
B after 1st operation [8,2,16]

2nd operation:  select i=0; j=2; 
B[i] += 2 i.e B[0]=10;
B[j] -= 2 i.e B[2] = 14;
B after 2nd operation [10,2,14]

顺序无关紧要,所以我们让数组等于 return 2;

我无法找到解决此问题的方法,也找不到任何类似的问题,因此在此发布,在此先感谢。

【问题讨论】:

  • 如果不可能使数组相等怎么办?例如,A 包含奇数但B 不包含任何奇数,或者如果A = [10, 20]B = [12, 22]
  • 你以前问过问题,有些得到了答案。你有什么理由不给他们反馈?他们有那么糟糕吗?

标签: arrays algorithm minimization


【解决方案1】:

假设数组是可解的,然后对数组进行排序,将增量的绝对值相加并除以 4。

例如。

A = [ 2, 10, 14 ], already sorted
B = [ 6, 2, 18 ], sorted becomes [2, 6, 18]

增量绝对值之和 = 0 + 4 + 4 = 8。8/4 = 2 所以 2 次移动。

【讨论】:

    【解决方案2】:
    A = [2, 10, 14]( % 2 == 0)
    B = [2, 6, 18]( % 2 == 0)
    

    另一个例子

    A = [1, 4, 5] -> [1, 5]( % 2 == 1) & [4]( % 2 == 0)
    B = [1, 2, 3] -> [1, 3]( % 2 == 1) & [2]( % 2 == 0)
    

    注意 (a + k) mod k == a。

    我们将数组分成k份,根据元素的mod k值,然后我们将所有的绝对差相加,是答案的四倍。

    k = 2
    A.sort(key=lambda x: x % k)
    B.sort(key=lambda x: x % k)
    result = 0
    n = len(A)
    for i in range(n):
        result += abs(A[i] - B[i])
    print(result >> 2)
    # A = [1, 2, 5]
    # B = [1, 3, 4]
    # result = 1
    # A = [2, 10, 14]
    # B = [6, 2, 18]
    # result = 2
    

    O(nlgn) 因为排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 2021-01-26
      相关资源
      最近更新 更多