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

파이썬에서 합이 같도록 주어진 두 배열에서 하위 배열 찾기


크기가 N인 두 개의 배열 P와 Q가 있고 1에서 N까지의 숫자를 보유하고 있다고 가정합니다. 주어진 배열에서 하위 배열이 동일한 합을 갖도록 찾아야 합니다. 마지막으로 그러한 하위 배열의 인덱스를 반환합니다. 솔루션이 없으면 -1을 반환합니다.

따라서 입력이 P =[2, 3, 4, 5, 6], Q =[9, 3, 2, 6, 5]인 경우 출력은 처음에 인덱스가 됩니다. 배열:0, 1, 2 및 두 번째 배열의 인덱스:0, 따라서 P[0..2] =2 + 3 + 4 =9 및 Q[0] =9.

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

  • get_subarray() 함수를 정의합니다. P, Q, 교환이 필요합니다.

  • N :=P의 크기

  • 색인 :=새 지도

  • 차이 :=0, j :=0

  • index[0] :=(-1, -1)과 같은 쌍

  • 범위 0에서 N까지의 i에 대해 수행

    • 동안 Q[j]

      • j :=j + 1

    • 차이 :=Q[j] - P[i]

    • 인덱스에 차이가 있는 경우

      • 스왑이 ture이면

        • idx :=인덱스[Q[j] - P[i]]

        • P

          에 대해 idx[1] + 1에서 j까지의 모든 값을 표시합니다.
        • Q

          에 대해 idx[0] + 1에서 i까지의 모든 값을 표시합니다.
      • 그렇지 않으면

        • idx :=인덱스[Q[j] - P[i]]

        • P

          에 대해 idx[0] + 1에서 i까지의 모든 값을 표시합니다.
        • Q

          에 대해 idx[1] + 1에서 j까지의 모든 값을 표시합니다.
      • 반환

    • 인덱스[차이] :=(i, j)

  • 디스플레이 -1

  • 주요 방법에서 다음을 수행하십시오 -

  • 누적 합계를 사용하여 P 및 Q 업데이트

  • N :=P의 크기

  • Q[N - 1]> P[N - 1]이면

    • get_subarray(P, Q, False)

  • 그렇지 않으면

    • get_subarray(Q, P, True)

예시

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

def show_res(x, y, num):
   print("Indices of array", num, ":", end = " ")
   for i in range(x, y):
      print(i, end = ", ")
   print(y)
def get_subarray(P, Q, swap):
   N = len(P)
   index = {}
   difference, j = 0, 0
   index[0] = (-1, -1)
   for i in range(0, N):
      while Q[j] < P[i]:
         j += 1
      difference = Q[j] - P[i]
      if difference in index:
         if swap:
            idx = index[Q[j] - P[i]]
            show_res(idx[1] + 1, j, 1)
            show_res(idx[0] + 1, i, 2)
         else:
            idx = index[Q[j] - P[i]]
            show_res(idx[0] + 1, i, 1)
            show_res(idx[1] + 1, j, 2)
         return
      index[difference] = (i, j)
   print(-1)
def cumsum(arr):
   n = len(arr)
   for i in range(1, n):
      arr[i] += arr[i - 1]
P = [2, 3, 4, 5, 6]
Q = [9, 3, 2, 6, 5]
cumsum(P)
cumsum(Q)
N = len(P)
if Q[N - 1] > P[N - 1]:
   get_subarray(P, Q, False)
else:
   get_subarray(Q, P, True)

입력

[2, 3, 4, 5, 6],[9, 3, 2, 6, 5]

출력

Indices of array 1 : 0, 1, 2
Indices of array 2 : 0