Cho hai mảng nums1, nums2 và hai số lower, upper. Đếm số cặp (i,j) thỏa lower ≤ nums1[i]² + nums2[j]² ≤ upper.
Ví dụ: nums1=[5,3,2], nums2=[8,12,6], lower=10, upper=50 → 2 (cặp (3,6) và (2,6)).
Giải thuật (Bình phương + Tìm kiếm nhị phân)
- Bình phương tất cả phần tử hai mảng
- Sắp xếp mảng lớn hơn (giả sử
nums2) - Với mỗi
e1trongnums1: tìm số phần tử trongnums2nằm trong[lower-e1, upper-e1]bằngbisect_left/right - Tổng cộng số lượng
Ví dụ triển khai
from bisect import bisect_left, bisect_right
def solve(nums1, nums2, lower, upper):
nums1 = [i * i for i in nums1]
nums2 = [i * i for i in nums2]
n, m = len(nums1), len(nums2)
if n > m:
nums1, nums2 = nums2, nums1
n, m = m, n
nums2.sort()
res = 0
for e1 in nums1:
st = bisect_left(nums2, lower - e1)
en = bisect_right(nums2, upper - e1)
res += en - st
return res
print(solve([5, 3, 2], [8, 12, 6], 10, 50))
Đầu vào
[5, 3, 2], [8, 12, 6], 10, 50
Đầu ra
2