样本输入:
14
3
4
8
我只需要弄清楚最后3个数字的唯一倍数,直到第一个数字。因此,3,4和8的唯一倍数直到14,这将是3,9,12,4,8。
我正在考虑的解决方案要么涉及多个数据结构,要么只是追加并计算最后结构的大小,要么是O(N ^ 2)解决方案,它将涉及在每次可能的插入时迭代结构。避免重复。
降低这个问题的复杂性的解决方案最终会变得比它需要的更复杂吗?
你可以通过使用最小堆来获得O(n)
空间和O(mlogn)
时间复杂度(m
是总倍数)。使用您的起始数字填充堆,其当前倍数(现在只是数字本身)作为其键。将last_seen
的变量设置为小于最小起始数(可能为零)。
现在,从堆中删除min键,如果它大于last_seen
并且小于或等于你的target_value
打印它。然后将last_seen
设置为等于此键。通过它存储的起始编号(3 + 3 -> 6
,6 + 3 -> 9
等)的值增加键的值(表示当前倍数),并将其重新添加到最小堆中。重复此过程,直到min键大于target_value
。如果在任何时候min键等于last_seen
,则该数字是重复的 - 只需跳过打印步骤并继续正常进行。
只需恒定的空间即可快速计算出来。
给定LIMIT,A,B,C,您想要的答案是A,B和C的倍数减去每对的倍数(因为它们将被计算两次),再加上倍数的倍数所有3(因为它将被计数3次,然后减去3次)。
其中LCM(x,y,...)是其参数的最低公倍数,公式为:
楼层(LIMIT / A)+楼层(LIMIT / B)+楼层(LIMIT / C) - 楼层(LIMIT / LCM(A,B)) - 楼层(LIMIT / LCM(A,C)) - 楼层(LIMIT / LCM) (B,C))+楼层(LIMIT / LCM(A,B,C))
对于你的例子是:
地板(14/3)+楼层(14/4)+楼层(14/8) - 楼层(14/12) - 楼层(14/24) - 楼层(14/8)+楼层(14/24)
= 4 + 3 + 1 - 1 - 0 - 1 + 0
= 6
嗯......你的列表中只有5个数字用于该示例 - 缺少数字6。
无论如何,或许提到N会有所帮助
让k数;一个[0],A [1],...,A [K-1] 和n是第一个数字的最大倍数(L)
n = SUM(L/a[i]) ; i = 0, 1,..., k-1
计算并将倍数附加到大小为n的数组/容器中 并且可以使用大小为L的Hashmap来跟踪重复项。
空间复杂度为O(L)和时间复杂度O(k * n)