Giả sử chúng ta có một mảng A gồm n số khác nhau và một số nguyên dương K khác, chúng ta phải tìm dãy con dài nhất trong mảng có Nhiều nhất Chung (LCM) ít nhất là K. Sau khi trả về LCM và độ dài của dãy con. - dãy số, theo sau các chỉ số (bắt đầu từ 0) của các phần tử của dãy con thu được. Nếu không, trả về -1.
Vì vậy, nếu đầu vào là A =[3, 4, 5, 6], K =20, thì đầu ra sẽ là LCM =12, Length =3, Indexes =[0,1,3]
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
n:=kích thước của A
-
my_dict:=một bản đồ
-
đối với tôi trong phạm vi từ 0 đến n, hãy thực hiện
-
my_dict [A [i]]:=my_dict [A [i]] + 1
-
-
count:=một mảng có kích thước (k + 1) điền bằng 0
-
đối với mỗi khóa trong my_dict, hãy thực hiện
-
phím if <=k, then
-
i:=1
-
trong khi phím * i <=k, thực hiện
-
count [key * i]:=count [key * i] + my_dict [key]
-
i:=i + 1
-
-
-
nếu không,
-
đi ra từ vòng lặp
-
-
-
lcm:=0, kích thước:=0
-
đối với tôi trong phạm vi từ 1 đến k + 1, hãy thực hiện
-
nếu đếm [i]> kích thước thì
-
size:=count [i]
-
lcm:=i
-
-
-
nếu lcm giống 0 thì
-
trả về -1
-
-
nếu không,
-
hiển thị lcm và kích thước
-
đối với tôi trong phạm vi từ 0 đến n, hãy thực hiện
-
nếu lcm mod A [i] giống 0 thì
-
hiển thị tôi
-
-
-
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
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) Đầu vào
[3, 4, 5, 6] , 20
Đầu ra
LCM = 12, Length = 3 Index values: 0 1 3