Brute Force
Check sum1 > sum2
Time: , space:
.
class Solution:
def countPairs(self, nums1: List[int], nums2: List[int]) -> int:
count = 0
n = len(nums1)
for i in range(n-1):
for j in range(i+1, n):
sum1 = nums1[i] + nums1[j]
sum2 = nums2[i] + nums2[j]
count += (1 if sum1 > sum2 else 0)
return count
Check diff1 + diff2 > 0
We check against a modified version of the inequality: (nums1[i] - nums2[i]) + (nums1[j] - nums2[j]) > 0. An important difference is that outer loop is only handling the index i and the inner loop is only handling the index j.
Time: , space:
.
class Solution:
def countPairs(self, nums1: List[int], nums2: List[int]) -> int:
count = 0
n = len(nums1)
for i in range(n-1):
diff1 = nums1[i] - nums2[i]
for j in range(i+1, n):
diff2 = nums1[j] - nums2[j]
count += (1 if diff1 + diff2 > 0 else 0)
return count
Sorted diffs
For each diff1 the inner loop is counting valid diff2‘s in time. We could compute on a sorted list of diffs to make the inner loop
.
With a sorted list of diffs, we could consider each diff as the left diff () and could efficiently find how many diffs on its right (
) are bigger than
. Because, we could binary-search for the leftmost occurrence of
. All diffs from thereon work as
such that
.
Time: , space:
.
class Solution:
def find_leftmost_index(self, x, nums, begin) -> int:
lo, hi = begin, len(nums)-1
pos = -1
while lo <= hi:
mid = (lo+hi) // 2
if nums[mid] < x:
lo = mid+1
else:
pos = mid
hi = mid-1
return pos
def countPairs(self, nums1: List[int], nums2: List[int]) -> int:
diffs = sorted(x-y for x, y in zip(nums1, nums2))
count, n = 0, len(diffs)
for i, d1 in enumerate(diffs):
least_d2 = -d1+1
pos = self.find_leftmost_index( least_d2, diffs, i+1 )
if pos < 0:
continue
count += (n-pos)
return count
Two pointers
In the sorted array, given a target, we can count all pairs with sum bigger than target in one scan. Here we use target = 0.
Time: , space:
.
class Solution:
def countPairs(self, nums1: List[int], nums2: List[int]) -> int:
diffs = sorted(x-y for x, y in zip(nums1, nums2))
count, n = 0, len(diffs)
i, j = 0, n-1
while i < j:
diff_sum = diffs[i] + diffs[j]
if diff_sum <= 0:
i += 1
else:
count += (j-i)
j -= 1
return count
Leave a comment