用 Python 编写程序检查子数组是否可以从等差序列重新排列
假设我们有数字序列 nums,以及另外两个大小为 m 的数组 l 和 r,这两个数组 l 和 r 表示范围查询,如 [l[i], r[i]]。我们必须找到一个布尔序列 ans,其中当子数组 nums[l[i]]、nums[l[i] + 1]、... nums[r[i] - 1]、nums[r[i]] 可以排列以生成等差序列时,ans[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, 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 相同的列表,并用所有真值填充
对于范围从 0 到 l - 1 的大小的 i,执行
数据 := 从索引 l[i] 到 r[i] 的数字子列表
对列表数据进行排序
d := 一个新列表
对于范围从 0 到数据大小 - 2 的 j,执行
在 d 末尾插入 data[j+1] - data[j]
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 参考教程 - 该教程包含有关 python 的更多信息:https://www.cainiaomax.com/python/

