题目
解答
解法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;
}
/**
* 查找大于等于目标点的 第一个坐标
*
* @param arr 数组
* @param right 右边界
* @param target 目标点
* @return
*/
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;
}
}