题目描述
给定一个排好序的整数数组,每个元素代表在数轴上的坐标。给定一个长度为L(L>0)绳子,问绳子最大覆盖的点数
思路一
遍历每个点x ,向前寻找最小的大于等于x-L的点 ,两点及之间的元素,都满足条件 ,寻找可以用二分算法,时间复杂度O(N*logN),空间复杂度O(1)
代码一
public static int maxPoint1(int[] arr, int L) {
int res=0;
for (int i = 0; i < arr.length; i++) {
int index=find(arr,0,i,arr[i]-L);
res=Math.max(res,i-index+1);
}
return res;
}
public static int find(int[] arr, int L, int R, int tar) {
int index=-1;
while(L<=R){
int M=(L+R)/2;
if (arr[M]>=tar) {
index=M;
R=M-1;
}else{
L=M+1;
}
}
return index;
}
思路二
双指针,开始两指针都指向开始位置,快指针向前遍历直到两者之间的距离大于L,算出最大值,慢指针再向前走,快指针重复上述操作。时间复杂度:O(N),空间复杂度O(1)。
代码二
public static int maxPoint2(int[] arr, int L) {
int i=0;
int j=0;
int res=0;
while(i<arr.length){
while(j<arr.length&&arr[j]-arr[i]<=L){
res=Math.max(res,j-i+1);
j++;
}
i++;
}
return res;
}