document.write('
本题求满足a[j]-a[i]<=L&&a[j+1]-a[i]>L这两个条件的j与i中间的所有点个数中的最大值,即j-i+1
最大,这样题目就简单多了,方法也很简单:直接从左到右扫描,使用两个索引i和j,i从位置0开
始,j从位置1开始,如果a[j]-a[i]≤L,则j+前进,并记录中间经过的点的个数,如果a[j]-a[i]>L,则
j-回退,覆盖点个数-1,回到刚好满足条件的时候,将满足条件的最大值与前面找出的最大值比
较,记录下当前的最大值,然后执行i+、j+,直到求出最大的点个数。
 有两点需要注意,如下所示:
 (1)这里可能不存在i和j使得a[j]-a[i]刚好等于L的情况发生,所以,判断条件不能为a[j]-a[i]==L。
 (2)可能存在不同的覆盖点但覆盖的长度相同的情况发生,此时只选取第一次覆盖的点。
 实现代码如下:
 def maxCover(a,L):
 count=2
 maxCount=1 #最长覆盖的点数
 start=0 #覆盖坐标的起始位置
 n=len(a)
 i=0
 j=1
 while i<n and j<n:
 while (j<n) and (a[j]-a[i]<=L):
 j+=1
 count+=1
 j-=1
 count-=1
 if count>maxCount:
 start=i
 maxCount=count
 i+=1
 j+=1
 print "覆盖的坐标点:",
 i=start
 while i<start+maxCount:
 print a[i],
 i+=1
 print \'\\n\'
 return maxCount
 
 if __name__=="__main__":
 a=[1,3,7,8,10,11,12,13,15,16,17,19,25]
 print "最长覆盖点数:"+str(maxCover(a,8))
 程序的运行结果为:
 覆盖的坐标点:7 8 10 11 12 13 15
 最长覆盖点数:7
 算法性能分析:
 这种方法的时间复杂度为O(N),其中,N为数组的长度。

 

');