You are given two non-increasing 0-indexed integer arrays nums1 and nums2.
A pair of indices (i, j), where 0 <= i < nums1.length and 0 <= j < nums2.length, is valid if both i <= j and nums1[i] <= nums2[j]. The distance of the pair is j - i.
Return the maximum distance of any valid pair (i, j). If there are no valid pairs, return 0.
An array arr is non-increasing if arr[i-1] >= arr[i] for every 1 <= i < arr.length.
Example 1:
Input: nums1 = [55,30,5,4,2], nums2 = [100,20,10,10,5]
Output: 2
Explanation: The valid pairs are (0,0), (2,2), (2,3), (2,4), (3,3), (3,4), and (4,4).
The maximum distance is 2 with pair (2,4).
Example 2:
Input: nums1 = [2,2,2], nums2 = [10,10,1]
Output: 1
Explanation: The valid pairs are (0,0), (0,1), and (1,1).
The maximum distance is 1 with pair (0,1).
Example 3:
Input: nums1 = [30,29,19,5], nums2 = [25,25,25,25,25]
Output: 2
Explanation: The valid pairs are (2,2), (2,3), (2,4), (3,3), and (3,4).
The maximum distance is 2 with pair (2,4).
Constraints:
1 <= nums1.length, nums2.length <= 105
1 <= nums1[i], nums2[j] <= 105
Both nums1 and nums2 are non-increasing.
Solutions
Solution 1: Binary Search
Thinking
Both arrays are nonincreasing; we want the largest \(j-i\) with \(i\le j\) and \(nums1[i]\le nums2[j]\). Trying every pair is \(O(mn)\) and too slow for \(n\le 10^5\).
For a fixed \(i\), the farthest legal \(j\) is the last index in \(nums2[i:]\) that is at least \(nums1[i]\). Reversing \(nums2\) lets us find that index by binary search.
Assume the lengths of \(nums1\) and \(nums2\) are \(m\) and \(n\) respectively.
Traverse array \(nums1\), for each number \(nums1[i]\), perform a binary search for numbers in \(nums2\) in the range \([i,n)\), find the last position \(j\) that is greater than or equal to \(nums1[i]\), calculate the distance between this position and \(i\), and update the maximum distance value \(ans\).
The time complexity is \(O(m \times \log n)\), where \(m\) and \(n\) are the lengths of \(nums1\) and \(nums2\) respectively. The space complexity is \(O(1)\).
Solution 1 uses only the monotonicity of \(nums2\). \(nums1\) is also nonincreasing, so the farthest \(j\) never moves left as \(i\) grows. Two pointers advance together in linear time.