在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]