我可以偷多少房子?

时间:2016-10-25 19:12:47

标签: python algorithm

我最近在一次软件职位的采访中得到了以下问题。据我所知,它是这样的:有一个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并再次执行相同的操作。

你能帮我更有效地解决它吗?

1 个答案:

答案 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)