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]

更新於:2021年10月6日

121次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.