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

Python을 사용하여 각각 대상 합계가 있는 두 개의 겹치지 않는 하위 배열을 찾는 프로그램

<시간/>

arr 배열과 다른 값 대상이 있다고 가정합니다. 각각의 합이 target과 같은 두 개의 겹치지 않는 arr의 하위 배열을 찾아야 합니다. 답이 여러 개라면 두 부분배열의 길이의 합이 가장 작은 답을 찾아야 합니다. 두 개의 필수 하위 배열 길이의 최소 합을 찾아야 합니다. 그러한 하위 배열이 없으면 -1을 반환합니다.

따라서 입력이 arr =[5,2,6,3,2,5] target =5와 같으면 출력은 2가 됩니다. 합계가 5인 3개의 하위 배열이 있고 [5], [3,2]입니다. ] 및 [5], 이제 그 중 2개만 크기가 가장 작습니다.

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

  • ans :=무한대

  • best :=크기가 arr과 같은 배열을 만들고 무한대로 채웁니다.

  • 접두사 :=0

  • 최신 :=키 0에 대해 -1을 저장하는 맵

  • rr의 각 인덱스 i와 값 x에 대해 수행

    • 접두사 :=접두사 + x

    • (접두사 - 대상)이 최신 항목에 있는 경우

      • ii :=최신[접두사 - 대상]

      • ii>=0이면

        • ans :=ans의 최소값 및 (i - ii + best[ii])

      • 최고[i] :=나는 - ii

    • i가 0이 아니면

      • 최신[접두사] :=i

  • <999999 그렇지 않으면 -1

    인 것처럼 반환

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

예시

def solve(arr, target):
   ans = 999999
   best = [999999]*len(arr)
   prefix = 0
   latest = {0: -1}
   for i, x in enumerate(arr):
      prefix += x
      if prefix - target in latest:
         ii = latest[prefix - target]
         if ii >= 0:
            ans = min(ans, i - ii + best[ii])
         best[i] = i - ii
      if i: best[i] = min(best[i-1], best[i])
      latest[prefix] = i
   return ans if ans < 999999 else -1
arr = [5,2,6,3,2,5]
target = 5
print(solve(arr, target))

입력

[5,2,6,3,2,5], 5

출력

2