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

左程云 - 大厂刷题班 - 绳子覆盖最多的点

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

左程云 - 大厂刷题班 - 绳子覆盖最多的点

题目

解答 解法1

时间复杂度O(n * logn)
二分法

思路

以数组的每一个点为绳子的末尾点,二分查找绳子中末尾点减绳子长度的点(起始点),结果为末尾点的坐标 - 起始点的坐标 + 1
注:二分查找可以看leetcode 35

代码
public class Solution {
    public int CordCoverMaxPoint(int[] arr, int K) {
        if (null == arr || arr.length < 0 || K == 0) {
            return 0;
        }

        int max = 0;
        for (int i = 0; i < arr.length; i++) {
            int ind = findInd(arr, i - 1, arr[i] - K);
            max = Math.max(i - ind + 1, max);
        }

        return max;
    }

    
    public int findInd(int[] arr, int right, int target) {
        int left = 0;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            // 左逼近
            if (arr[mid] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }

        return left;
    }
}
解法2

时间复杂度O(n)
滑动窗口

思路

遍历每一个点,并以遍历的点为左指针,以另一个点为右指针,右指针寻找符合条件(绳子长度)的点

代码
public class Solution {
    public static int CordCoverMaxPoint(int[] arr, int K) {
        if (null == arr || arr.length < 0 || K == 0) {
            return 0;
        }

        int max = 0;
        int right = -1;

        for (int left = 0; left < arr.length; left++) {
            while (right + 1 < arr.length && arr[right + 1] - arr[left] <= K) {
                ++right;
            }
            max = Math.max(right - left + 1, max);
        }

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

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

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