在Python中检查子数组是否可以从算术序列重新排列

在Python中检查子数组是否可以从算术序列重新排列

假设我们有一系列数字 nums,以及另外两个大小为 m 的数组 l 和 r,这些 l 和 r 表示范围查询,如 [l[i], r[i]]。我们必须找到一个布尔序列 ans,其中 ans[i] 为 true,当子数组 nums [l[i]],nums [l[i] + 1],…nums [r[i] – 1],nums [r[i]] 可以排列成等差数列时,否则为 false。

如果这个序列至少包含两个元素,并且每两个相邻元素之间的差都一样,那么这个序列就被称为等差数列。例如,一些等差数列是:[2, 4, 6, 8, 10],[5, 5, 5, 5],[4,-2,-8,-14],但不包括 [2, 2, 3, 6, 9]。

所以,如果输入是 nums = [6,8,7,11,5,9],l = [0,0,2],r = [2,3,5],那么输出将是 [True, False, True],因为 −

  • 对于查询 [0,2],序列为 [6,8,7],可以重新排列为 [6,7,8],这是有效的。

  • 对于查询 [0,3],序列为 [6,8,7,11],不能被重新排列成等差数列。

  • 对于查询 [2,5],序列为 [7,11,5,9],可以重新排列为 [5,7,9,11],这是有效的。

为了解决这个问题,我们需要按照以下步骤进行操作:

  • new := 一个大小与 l 相同的列表,并用所有 true 值填充

  • 对于 i 在范围 0 到 l 的大小 – 1,进行以下操作

    • data := 从索引 l[i] 到 r[i] 的 nums 的子列表

    • 对列表 data 进行排序

    • d := 一个新的列表

    • 对于 j 在范围 0 到数据大小 – 2,进行以下操作

      • 将 data [j+1] – data [j] 插入到 d 的末尾
    • d := 从 d 的新集合创建的新列表

    • 如果 d 的大小与 1 不同,则

      • new [i] := False
  • 返回 new

示例

让我们查看以下实现以更好地理解 −

def solve(nums, l, r):
   new = [True]*len(l)

   for i in range(len(l)):
      data = nums[l[i]:r[i]+1]
      data.sort()

      d = []
      for j in range(len(data) - 1):
         d.append(data[j+1] - data[j])

      d = list(set(d))
      if len(d) != 1:
         new[i] = False   return new

nums = [6,8,7,11,5,9]
l = [0,0,2]
r = [2,3,5]
print(solve(nums, l, r))

输入

[6,8,7,11,5,9],[0,0,2],[2,3,5]

输出

[True,False,True]

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程