在Python中查找从第一个侧面和最后一侧面配对所需的操作数

在Python中查找从第一个侧面和最后一侧面配对所需的操作数

假设我们有一个名为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的最大值
  • 事件:=一个新列表
  • idx:= 0
  • while idx
  • 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
    • 对事件中的每对(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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程