Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 LCM이 최대 K인 배열의 가장 긴 부분 시퀀스 찾기

<시간/>

n개의 다른 숫자와 다른 양의 정수 K로 구성된 배열 A가 있다고 가정하고, 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 :=0으로 채워지는 크기(k + 1)의 배열

  • my_dict의 각 키에 대해 수행

    • 키 <=k인 경우

      • 나는 :=1

      • 동안 키 * i <=k, 수행

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

        • 나는 :=나는 + 1

    • 그렇지 않으면

      • 루프에서 나오다

  • 1cm :=0, 크기 :=0

  • 범위 1에서 k + 1까지의 i에 대해 수행

    • 개수[i]> 크기이면

      • 크기 :=개수[i]

      • lcm :=나는

  • lcm가 0과 같으면

    • 반환 -1

  • 그렇지 않으면

    • lcm 및 크기 표시

    • 0에서 n 사이의 i에 대해 수행

      • lcm mod 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