栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

LeetCode 1855. 下标对中的最大距离

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode 1855. 下标对中的最大距离

题目链接:

力扣https://leetcode.cn/problems/maximum-distance-between-a-pair-of-values/

【方法一 二分查找】枚举nums2中的元素,在nums1中查找<=nums2[i]的最小下标元素。

class Solution {
    
    public int binarySearch(int[] nums, int target){
        int left = 0, right = nums.length - 1;
        while(left <= right){
            int mid = (left + right) >>> 1;
            if(nums[mid] <= target){
                right = mid - 1;
            }else{
                left = mid + 1;
            }
        }
        return left;
    }

    public int maxDistance(int[] nums1, int[] nums2) {
        int n = nums2.length, m = nums1.length;
        int ans = 0;
        for(int i = 0; i < n; i++){
            int idx = binarySearch(nums1, nums2[i]);
            if(idx >=0 && idx < m && nums1[idx] <= nums2[i]) ans = Math.max(ans, i - idx);
        }
        return ans;
    }
}

【改进】 缩短一下查找的距离,只找i左侧的

class Solution {

    int[] nums;
    int m;
    
    public int binarySearch(int right, int target){
        int left = 0;
        right = Math.min(right, m - 1);
        while(left <= right){
            int mid = (left + right) >>> 1;
            if(nums[mid] <= target){
                right = mid - 1;
            }else{
                left = mid + 1;
            }
        }
        return left;
    }

    public int maxDistance(int[] nums1, int[] nums2) {
        nums = nums1; m = nums1.length;
        int n = nums2.length;
        int ans = 0;
        for(int i = 0; i < n; i++){
            int idx = binarySearch(i - 1, nums2[i]);
            if(idx >=0 && idx < m && nums1[idx] <= nums2[i]) ans = Math.max(ans, i - idx);
        }
        return ans;
    }
}

【方法二 双指针】要求nums1[i]<=nums2[j],我们就去找第一个nums2[j]

class Solution {
    public int maxDistance(int[] nums1, int[] nums2) {
        int i = 0, j = 0, m = nums1.length, n = nums2.length;
        int ans = 0;
        for(i = 0; i < m; i++){
            while(j < n && nums2[j] >= nums1[i]) j++;
            ans = Math.max(ans, j - i - 1);
            if(j == n) break;
        }
        return ans;
    }
}

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/878343.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号