두 개의 배열 nums1과 nums2가 있다고 가정하고 이 두 가지 규칙에 따라 형성된 삼중항(유형 1 및 유형 2)을 찾아야 합니다. -
- 3중항(i, j, k) if nums1[i]^2 =nums2[j] * nums2[k] 여기서 [0 <=i
- 3중항(i, j, k) if nums2[i]^2 =nums1[j] * nums1[k] 여기서 [0 <=i
- 3중항(i, j, k) if nums2[i]^2 =nums1[j] * nums1[k] 여기서 [0 <=i
따라서 입력이 nums1 =[7,4] nums2 =[5,2,8,9]와 같으면 유형 1, (1,1,2), nums1의 삼중항이 있기 때문에 출력은 1이 됩니다. [1]^2 =숫자2[1] * 숫자2[2] =(16 =2*8).
이 문제를 해결하기 위해 다음 단계를 따릅니다.
- cnt1 :=각 요소와 nums1의 개수를 담는 맵
- cnt2 :=각 요소와 nums2의 개수를 담는 맵
- triplets() 함수를 정의합니다. arr1, ar2가 걸립니다.
- ans :=0
- arr1의 항목()에 있는 각 t, v에 대해
- k :=arr2[t] 있으면 0
- tmp :=k*(k - 1) / 2
- 제곱:=t * t
- arr2의 각 m에 대해
- m
- tmp :=tmp + (arr2[m] 있으면 0) * (arr2[제곱/m의 몫] 있으면 0)
- m
예시
더 나은 이해를 위해 다음 구현을 살펴보겠습니다-
from collections import Counter def solve(nums1, nums2): cnt1 = Counter(nums1) cnt2 = Counter(nums2) def triplets(arr1, arr2): ans = 0 for t, v in arr1.items(): k = arr2.get(t, 0) tmp = k * (k - 1) // 2 sq = t * t for m in arr2: if m < t and sq % m == 0: tmp += arr2.get(m, 0) * arr2.get(sq // m, 0) ans += tmp * v return ans return triplets(cnt1, cnt2) + triplets(cnt2, cnt1) nums1 = [7,4] nums2 = [5,2,8,9] print(solve(nums1, nums2))
입력
[7,4],[5,2,8,9]
출력
2