思路时间复杂度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;
}
}



