我最近在一次软件职位的采访中得到了以下问题。据我所知,它是这样的:有一个n
个房子在一个由数组A [1 ... n]表示的范围内,按排序顺序包含它们各自的位置。
例如,考虑数组A[] = {1,3,5,10}
。每个房子都有一枚金币,作为一个小偷,你想从k
房屋里偷金币。
但是有一个限制:如果我选择k
个房屋,那么任何两个选定房屋之间的距离差异必须大于k
。
在上面的示例中:如果k = 3
,那么我可以选择位置为1,5,10
的房屋。如果k = 4
,我无法根据上述约束选择4栋房屋。
我想最大化k 。
在上面的示例中,k = 3
是预期答案。
目前,我有一个强力天真的算法,其中对于从1
开始的每个k值,我检查是否有多少个房屋选择是可能的。如果可能的话,我会增加k
并再次执行相同的操作。
你能帮我更有效地解决它吗?
答案 0 :(得分:2)
想法:二进制搜索k的值。
让数组排序
low=1
high=min(n,sqrt(a[n] - a[1]))
while(low<=high)
mid = (low+high)/2
if( mid is a valid answer)
low=mid+1
else
high=mid-1
return high
现在要检查给定的mid
值是否是有效答案,您只需使用贪心策略:
选择1st
房子,然后继续选择距离最后选择的房屋至少mid
距离的下一个房子,如果最后,被抢房屋的数量大于或等于{{ 1}},然后有效的盗窃是可能的,否则不是。
复杂性:O(n log n)