Python程式:檢查子陣列能否重新排列成等差數列
假設我們有一組數字nums,以及另外兩個大小為m的陣列l和r,這些l和r表示範圍查詢,例如[l[i], r[i]]。我們需要找到一個布林序列ans,其中ans[i]為真,當且僅當子陣列nums[l[i]], nums[l[i] + 1], ... nums[r[i] - 1], 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, 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大小相同的列表,並用全真值填充。
對於i從0到l的大小-1,執行:
data := 從索引l[i]到r[i]的nums的子列表。
對列表data進行排序。
d := 一個新列表。
對於j從0到data的大小-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]
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP