有没有办法判断两个数字数组(可以包含正数,负数或重复数)是O(n)
时间复杂度和O(1)
空间复杂度的相互排列?由于狭窄的空间限制,我无法解决它。
答案 0 :(得分:2)
如果数字是整数,in-place radix sort可以为您提供O(nlogk)
时间,其中k
是数字的范围,n
是元素的数量。
请注意,对于递归调用的堆栈跟踪,算法需要O(logk)
空间。
如果你可以将k
绑定到常量(例如2 ^ 64) - 那么O(n)
空间就会O(1)
。
排序后 - 您可以简单地迭代两个阵列并检查它们是否相同。
答案 1 :(得分:0)
如果您对数字本身的范围有严格的限制,则可以这样做。
比如说,你知道你有两个阵列A和B,并且这些数字绑定在-128和+127之间(8位签名)。您只需要一个包含256个位置的数组。每个号码n
都会映射到位置n + 128
。
迭代两个数组,对于数组A,您将增加相应的位置,对于数组B,您递减。然后检查所有位置是否为0。如果是,则数组是排列,如果不是,则不是。
时间复杂度为O(n+k)
。空间复杂度为O(k)
,其中k
是数字的范围。由于k
与n
无关,因此O(n)
和O(1)
与n
有关,只要您对{{1}有约束}}
另请注意,时间复杂度可以进一步降低为k
而不是O(n)
。您只需保持一个非零计数的运行总数。每次递增/递减将计数推送到其他位置时,您都会增加运行总计。每次将推送到零时,您都会减少总数。最后,如果总数为0,则所有计数均为0。
编辑:Amit的答案可能有更好的空间复杂性,但是:)
PS:但是,如果数字数组是流入的,则可以应用此算法,因此它们实际上不必全部保存在内存中。所以它的空间复杂度可能小于直接排序如果条件合适