C++ 夹带二分
nlog(n)
class Solution {
public:
int maxDistance(vector<int>& nums1, vector<int>& nums2) {
int len1 = nums1.size();
int len2 = nums2.size();
//找当前值比某一个数大,但是这个数尽量最大
//如果这个数找不到,说明,当前值最小
int max_dis = 0;
for(int i = 0; i < len2; i++){
int now_dis = 0; //相当于nums2[i] 最小
//当nums1[i]比任何值都小,则 l ==r == 0
int l = 0,r = min(i,len1-1);
while(l <= r){
int mid = l + (r-l)/2;
int target = nums2[i];
if(target > nums1[mid]){
r = mid-1;
now_dis = max(now_dis,i-mid); //可确定,且范围向左边缩小,找到尽可能大的值
}
if(target == nums1[mid]){
r = mid-1;
now_dis = max(now_dis,i-mid); //可确定,且范围在向左边缩小
}
if(target < nums1[mid]) l = mid+1;
}
max_dis = max(max_dis,now_dis);
}
return max_dis;
}
};
java 二分
nlog(n)
class Solution {
public int maxDistance(int[] nums1, int[] nums2) {
int len1 = nums1.length;
int len2 = nums2.length;
int maxDis = 0;
for(int i = 0; i < len2; i++){
int nowDis = 0;
int l = 0, r = Math.min(i,len1-1);
while(l <= r){
int target = nums2[i];
int mid = l + (r-l)/2;
if(target >= nums1[mid]){
nowDis = Math.max(nowDis,i-mid);
r = mid-1;
}else l = mid + 1;
}
maxDis = Math.max(maxDis,nowDis);
}
return maxDis;
}
}
解法2
C++
O(l1+l2)
class Solution {
public:
int maxDistance(vector<int>& nums1, vector<int>& nums2) {
int l1 = nums1.size();
int l2 = nums2.size();
int maxDis = 0;
int j = 0;
for(int i = 0; i < l2; i++){
while(j < l1 && nums1[j] > nums2[i]){
j++;
}
if(j < l1 && j <= i) maxDis = max(maxDis,i-j);
}
return maxDis;
}
};
JAVA
O(l1+l2);
class Solution {
public int maxDistance(int[] nums1, int[] nums2) {
int l1 = nums1.length,l2 = nums2.length;
int res = 0,j = 0;
for(int i = 0; i < l2; i++){
while(j < l1 && nums1[j] > nums2[i]) j++;
if(j < l1 && j <= i) res = Math.max(res,i-j);
}
return res;
}
}