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

파이썬에서 합을 k로 나눌 수 있도록 삭제할 수 있는 가장 작은 하위 목록의 길이를 찾는 프로그램

<시간/>

nums라고 하는 양수 값이 있고 양수 k도 있는 목록이 있다고 가정합니다. 나머지 요소의 합이 k로 나눌 수 있도록 num에서 삭제할 수 있는 가장 짧은 하위 목록(비어 있을 수 있음)의 길이를 찾아야 합니다. 그러나 전체 목록을 제거할 수는 없습니다. 삭제할 하위 목록이 없으면 -1을 반환합니다.

따라서 입력이 nums =[5,8,6,3] k =8과 같으면 [5,8,6,3] 요소의 현재 합이 22이기 때문에 출력은 1이 됩니다. 길이가 1인 하위 목록 [6]을 제거하면 합계는 16이며 8로 나눌 수 있습니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • rem :=(nums + k에 있는 모든 요소의 합) mod k
  • rem이 0과 같으면
    • 0을 반환
  • n :=숫자 크기
  • 추정 :=0
  • mp :=사전, 초기에 키 0에 대해 -1을 저장
  • res :=n
  • 0 ~ n - 1 범위의 i에 대해
    • presum :=추정 + 숫자[i]
    • m :=(추정 + k) 모드 k
    • mp[m] :=나
    • 만약 (m - rem + k) mod k가 mp에 있으면
      • res :=res의 최소값 및 (i - mp[(m - rem + k) mod k])
  • res가 n과 같지 않으면 res를 반환하고 그렇지 않으면 -1

예시

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

def solve(nums, k):
   rem = (sum(nums) + k) % k
   if rem == 0:
      return 0
   n, presum = len(nums), 0
   mp = {0: -1}
   res = n
   for i in range(n):
      presum += nums[i]
      m = (presum + k) % k
      mp[m] = i
      if (m - rem + k) % k in mp:
         res = min(res, i - mp[(m - rem + k) % k])
   return res if res != n else -1

nums = [5,8,6,3]
k = 8
print(solve(nums, k))

입력

[5,8,6,3], 8

출력

1