针对涉及计算2个或更多个数的唯一倍数的问题优化空间复杂度?

问题描述 投票:0回答:3

样本输入:

14
3
4
8

我只需要弄清楚最后3个数字的唯一倍数,直到第一个数字。因此,3,4和8的唯一倍数直到14,这将是3,9,12,4,8。

我正在考虑的解决方案要么涉及多个数据结构,要么只是追加并计算最后结构的大小,要么是O(N ^ 2)解决方案,它将涉及在每次可能的插入时迭代结构。避免重复。

降低这个问题的复杂性的解决方案最终会变得比它需要的更复杂吗?

algorithm data-structures
3个回答
2
投票

你可以通过使用最小堆来获得O(n)空间和O(mlogn)时间复杂度(m是总倍数)。使用您的起始数字填充堆,其当前倍数(现在只是数字本身)作为其键。将last_seen的变量设置为小于最小起始数(可能为零)。

现在,从堆中删除min键,如果它大于last_seen并且小于或等于你的target_value打印它。然后将last_seen设置为等于此键。通过它存储的起始编号(3 + 3 -> 66 + 3 -> 9等)的值增加键的值(表示当前倍数),并将其重新添加到最小堆中。重复此过程,直到min键大于target_value。如果在任何时候min键等于last_seen,则该数字是重复的 - 只需跳过打印步骤并继续正常进行。


1
投票

只需恒定的空间即可快速计算出来。

给定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。


0
投票

无论如何,或许提到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)

© www.soinside.com 2019 - 2024. All rights reserved.