leetcode-1855. 下标对中的最大距离--【二分】


在这里插入图片描述

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;
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值