我刚刚遇到了一个Codility问题,这给我带来了困难,但我仍在尝试弄清楚如何才能满足空间和时间复杂性的限制。
问题如下:数组中的主要成员是占据数组中一半以上位置的成员,例如:
{3,67,23,67,67}
67是主要成员,因为它在数组中以3/5(> 50%)的位置出现。
现在,您将期望提供一种方法,该方法接受一个数组并返回一个占主导地位的成员(如果存在)的索引,如果不存在则返回-1。
容易吧?好吧,如果不是因为以下限制,我本可以轻松解决问题:
我可以看到如何解决O(n)时间复杂度为O(n)的时间以及O(n ^ 2)时间复杂度为O(1)的问题,但又不能同时满足O(n)时间的问题和O(1)空间。
我真的很感激看到这个问题的解决方案。不用担心,截止日期已经过了几个小时(我只有30分钟),所以我不打算作弊。谢谢。
用BFPRT找到中位数,也就是中位数的中位数(O(N)时间,O(1)空间)。然后扫描整个数组- 如果一个数字占主导地位,则中位数将等于该数字。遍历数组并计算该数目的实例数目。如果超过数组的一半,那就是主导者。否则,没有统治者。