【452】最小移动次数使数组相等 | 豆包MarsCode AI刷题

42 阅读3分钟

问题描述: 小C有两个长度为N的数组A和B。他可以进行以下两种操作,来将数组A转换为数组B:

  1. 反转数组A,即使数组A的元素顺序完全颠倒。
  2. 在[1, N]范围内选择一个整数i,然后可以对A[i]添加或减去任意值。

你的任务是帮助小C找到使数组A等于数组B所需的最小操作次数。

示例: 例如,当N=3,A=[1, 2, 5],B=[4, 2, 1]时,最佳操作如下:

第一步:反转数组A,得到新数组A=[5, 2, 1]。 第二步:从位置1减去1,得到新数组A=[4, 2, 1]。 因此答案是2。

解题思路:

  1. 首先,我们需要计算不反转数组A的情况下,将A转换为B所需的操作次数。这可以通过遍历数组A和B,比较对应位置的元素,如果不相等则增加操作次数来实现。
  2. 然后,我们需要计算反转数组A后,将A转换为B所需的操作次数。这同样通过遍历数组A的反转数组和B,比较对应位置的元素,如果不相等则增加操作次数来实现。
  3. 接下来,我们需要比较不反转和反转数组A时的操作次数,选择两者中较小的一个作为最小操作次数。
  4. 如果反转数组A的操作次数更小,那么我们需要在最小操作次数上加1,因为还需要进行一次反转操作。
  5. 最后,返回计算得到的最小操作次数。

解题步骤:

  1. 定义一个函数calc_operations来计算将A转换为B所需的操作次数。
  2. 计算不反转A时的操作次数。
  3. 计算反转A后操作次数。
  4. 比较两种情况下的操作次数,选择较小的一个。
  5. 如果反转A的操作次数更小,加1表示需要进行反转操作。
  6. 返回最小操作次数。

解题代码(python):

def solution(N: int, A: list, B: list) -> int:
    # 计算不反转A时的操作次数
    def calc_operations(A, B):
        operations = 0
        for i in range(N):
            if A[i] != B[i]:
                operations += 1
        return operations

    # 不反转A的操作次数
    operations_not_reversed = calc_operations(A, B)
    
    # 反转A的操作次数
    A_reversed = A[::-1]
    operations_reversed = calc_operations(A_reversed, B)
    
    # 选择最小操作次数,并判断是否需要反转
    min_operations = min(operations_not_reversed, operations_reversed)
    if operations_reversed < operations_not_reversed:
        min_operations += 1  # 需要反转数组A
    return min_operations

if __name__ == '__main__':
    print(solution(N=3, A=[1, 2, 5], B=[4, 2, 1]) == 2)
    print(solution(N=4, A=[7, 8, 6, 2], B=[6, 2, 8, 7]) == 3)
    print(solution(N=2, A=[3, 9], B=[9, 3]) == 1)

解题思路详细解析:

  1. 我们定义了一个辅助函数calc_operations来计算将A转换为B所需的操作次数。这个函数通过遍历A和B,比较对应位置的元素,如果不相等则增加操作次数。
  2. 我们计算了不反转A时的操作次数,即直接使用A和B计算。
  3. 我们计算了反转A后操作次数,即使用A的反转数组和B计算。
  4. 我们比较了两种情况下的操作次数,选择了较小的一个作为最小操作次数。
  5. 如果反转A的操作次数更小,我们在最小操作次数上加1,因为还需要进行一次反转操作。
  6. 最后,我们返回了计算得到的最小操作次数。

复杂度分析: 时间复杂度:O(N),其中N是数组A和B的长度。这是因为我们需要遍历数组A和B来计算操作次数。 空间复杂度:O(1),除了输入和输出数据,算法只使用了常量空间。