Input: nums1 =[3,2,5], nums2 =[2,2,1], diff =1Output: 3Explanation:
There are 3 pairs that satisfy the conditions:1. i =0, j =1:3-2<=2-2+1. Since i < j and 1<=1,this pair satisfies the conditions.2. i =0, j =2:3-5<=2-1+1. Since i < j and -2<=2,this pair satisfies the conditions.3. i =1, j =2:2-5<=2-1+1. Since i < j and -3<=2,this pair satisfies the conditions.Therefore, we return3.
We want to count pairs (i, j) with i < j such that nums1[i] - nums1[j] <= nums2[i] - nums2[j] + diff. Rearranging, we get (nums1[i] - nums2[i]) <= (nums1[j] - nums2[j]) + diff. This is a classic “count of pairs with difference <= k” problem, which can be solved efficiently using merge sort and counting during the merge step.
#include<vector>usingnamespace std;
classSolution {
public:longlong mergeCount(vector<longlong>& arr, int l, int r, int diff) {
if (r - l <=1) return0;
int m = l + (r - l) /2;
longlong cnt = mergeCount(arr, l, m, diff) + mergeCount(arr, m, r, diff);
int j = m;
for (int i = l; i < m; ++i) {
while (j < r && arr[i] > arr[j] + diff) ++j;
cnt += r - j;
}
inplace_merge(arr.begin() + l, arr.begin() + m, arr.begin() + r);
return cnt;
}
longlongnumberOfPairs(vector<int>& nums1, vector<int>& nums2, int diff) {
int n = nums1.size();
vector<longlong> arr(n);
for (int i =0; i < n; ++i) arr[i] = nums1[i] - nums2[i];
return mergeCount(arr, 0, n, diff);
}
};
classSolution {
publiclongnumberOfPairs(int[] nums1, int[] nums2, int diff) {
int n = nums1.length;
long[] arr =newlong[n];
for (int i = 0; i < n; ++i) arr[i]= nums1[i]- nums2[i];
return mergeCount(arr, 0, n, diff);
}
privatelongmergeCount(long[] arr, int l, int r, int diff) {
if (r - l <= 1) return 0;
int m = l + (r - l) / 2;
long cnt = mergeCount(arr, l, m, diff) + mergeCount(arr, m, r, diff);
int j = m;
for (int i = l; i < m; ++i) {
while (j < r && arr[i]> arr[j]+ diff) ++j;
cnt += r - j;
}
java.util.Arrays.sort(arr, l, r);
return cnt;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
classSolution {
funnumberOfPairs(nums1: IntArray, nums2: IntArray, diff: Int): Long {
val n = nums1.size
val arr = LongArray(n) { nums1[it].toLong() - nums2[it].toLong() }
funmergeCount(arr: LongArray, l: Int, r: Int): Long {
if (r - l <=1) return0Lval m = l + (r - l) / 2var cnt = mergeCount(arr, l, m) + mergeCount(arr, m, r)
var j = m
for (i in l until m) {
while (j < r && arr[i] > arr[j] + diff) j++ cnt += (r - j)
}
arr.sort(l, r)
return cnt
}
return mergeCount(arr, 0, n)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
classSolution:
defnumberOfPairs(self, nums1, nums2, diff):
arr = [a-b for a,b in zip(nums1, nums2)]
defmerge_count(arr):
defsort(l, r):
if r-l <=1: return0 m = (l+r)//2 cnt = sort(l, m) + sort(m, r)
j = m
for i in range(l, m):
while j < r and arr[i] > arr[j] + diff:
j +=1 cnt += r-j
arr[l:r] = sorted(arr[l:r])
return cnt
return sort(0, len(arr))
return merge_count(arr)