检查子数组的程序可以从算术序列重新排列或不在 Python 中重新排列

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

如果一个序列至少由两个元素组成,并且每两个连续元素之间的差值相同,则称该序列是算术序列。例如,一些等差数列是:[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 , 假, 真] 因为 -

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

  • 查询[0, 3],序列为[6,8,7,11],不能重排等差数列

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

示例

让我们看看以下实现以获得更好的理解 -

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]

猜你喜欢