用 Python 编写程序,查找使第一侧和最后一侧的配对总和相同的操作数

pythonserver side programmingprogramming更新于 2026/1/19 16:44:17

假设我们有一个名为 nums 的数字列表。此列表的长度为偶数。现在考虑一个操作,我们选择 nums 中的任意数字,并用 [1 和 nums 的最大值] 范围内的值更新它。我们必须找到所需的最少此类操作数,使得对于每个 i,nums[i] + nums[n-1-i] 等于相同的数字。

因此,如果输入为 nums = [8,6,2,5,9,2],则输出将为 2,因为如果我们先将 nums[2] 处的 2 更改为 5,将 nums[4] 处的 9 更改为 4,则元素将为 [8,6,5,5,4,2],然后每个 i 的 nums[i] + nums[n-1-i] 将为 (8+2) = (6+4) = (5+5) = 10。

要解决这个问题,我们将遵循以下步骤 −

  • N := nums 的大小
  • mx := 最大 nums
  • events := 一个新列表
  • idx := 0
  • while idx < N / 2 的下限,执行
    • a := nums[idx]
    • b := nums[N - idx - 1]
    • 在事件末尾插入一对 ((a + 1)、(b + 1)、1 中的最小值)
    • 在事件末尾插入一对 (a + b, 1)
    • 在事件末尾插入一对 (a + b + 1, -1)
    • 在事件末尾插入一对 ((a + mx) 和 (b + mx + 1) 中的最大值)、-1)
    • idx := idx + 1
  • 对事件列表进行排序
  • current := 0
  • mx_same := 0
  • 对于 events 中的每个对 (event, delta),执行
    • current := current + delta
    • mx_same := current 和 mx_same 的最大值
  • 返回 N - mx_same

示例

让我们看看下面的实现以便更好地理解 −

def solve(nums):
   N = len(nums)
   mx = max(nums)
   events = []

   idx = 0
   while idx < N // 2:
      a = nums[idx]
      b = nums[N - idx - 1]

      events.append((min(a + 1, b + 1), 1))
      events.append((a + b, 1))
      events.append((a + b + 1, -1))
      events.append((max(a + mx, b + mx) + 1, -1))

   idx += 1

   events.sort()
   current = 0
   mx_same = 0

   for event, delta in events:
      current += delta
      mx_same = max(current, mx_same)

   return N - mx_same

nums = [8,6,2,5,9,2]
print(solve(nums))

输入

[6, 8, 5, 2, 3]

输出

2

相关文章


有用资源