使用 Python 查詢陣列中 LCM 最多為 K 的最長子序列


假設我們有一個包含 n 個不同數字的陣列 A 和另一個正整數 K,我們需要找到陣列中具有最小公倍數 (LCM) 最多為 K 的最長子序列。然後返回 LCM 和子序列的長度,以及獲得的子序列元素的索引(從 0 開始)。否則,返回 -1。

因此,如果輸入類似於 A = [3, 4, 5, 6],K = 20,則輸出將是 LCM = 12,長度 = 3,索引 = [0,1,3]

為了解決這個問題,我們將遵循以下步驟:

  • n := A 的大小

  • my_dict := 一個對映

  • 從 0 到 n 迴圈 i,執行:

    • my_dict[A[i]] := my_dict[A[i]] + 1

  • count := 一個大小為 (k + 1) 並填充 0 的陣列

  • 對於 my_dict 中的每個鍵,執行:

    • 如果 key <= k,則:

      • i := 1

      • 當 key * i <= k 時,執行:

        • count[key * i] := count[key * i] + my_dict[key]

        • i := i + 1

    • 否則:

      • 退出迴圈

  • lcm := 0,size := 0

  • 從 1 到 k + 1 迴圈 i,執行:

    • 如果 count[i] > size,則:

      • size := count[i]

      • lcm := i

  • 如果 lcm 等於 0,則:

    • 返回 -1

  • 否則:

    • 顯示 lcm 和 size

    • 從 0 到 n 迴圈 i,執行:

      • 如果 lcm 模 A[i] 等於 0,則:

        • 顯示 i

示例

讓我們看看以下實現,以更好地理解:

即時演示

from collections import defaultdict
def get_seq(A,k):
   n = len(A)
   my_dict = defaultdict(lambda:0)
   for i in range(0, n):
      my_dict[A[i]] += 1
   count = [0] * (k + 1)
   for key in my_dict:
      if key <= k:
         i = 1
         while key * i <= k:
            count[key * i] += my_dict[key]
            i += 1
      else:
         break
   lcm = 0
   size = 0
   for i in range(1, k + 1):
      if count[i] > size:
         size = count[i]
         lcm = i
   if lcm == 0:
      print(-1)
   else:
      print("LCM = {0}, Length = {1}".format(lcm, size))
      print("Index values: ", end = "")
      for i in range(0, n):
         if lcm % A[i] == 0:
            print(i, end = " ")

k = 20
A = [3, 4, 5, 6]
get_seq(A,k)

輸入

[3, 4, 5, 6] , 20

輸出

LCM = 12, Length = 3 Index values: 0 1 3

更新於: 2020年8月20日

413 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告