有没有办法告诉如果两个数字阵列(可包含正片,负片或重复)是彼此的排列在O(n)
时间复杂度和O(1)
空间的复杂性?由于空间有限,我无法解决这个问题。
2
A
回答
2
如果数字是整数 - in-place radix sort可以给你O(nlogk)
时间,其中k
是号码的范围,n
是元素的数量。
请注意,该算法需要O(logk)
空间,用于递归调用的堆栈跟踪。
如果你可以将k
限定为一个常数(例如2^64) - 你可以得到O(n)
的时间,空间为O(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
而言,只要你有一个约束k
。
还要注意时间复杂度可以进一步简化为O(n)
而不是O(n+k)
。您只需保持总数不为零的数字。每次增加/减少都会将计数从其他值中推出,从而增加运行总数。每当它将到归零时,就减少总数。最后,如果总为0,则所有计数为0
编辑:Amit的答案很可能有一个更好的空间复杂度虽然:)
PS:不过,这种算法可以当的阵列应用数字流入,所以他们永远不必全部留在记忆中。所以它可能比直接排序的空间复杂度更小如果条件正确
相关问题
- 1. 确定两个复数是否相等
- 2. 确定是否有两个相邻字符相同的字符
- 3. 确定两个对象是否相等
- 4. 确定如果两个SyntaxTokens是相同
- 5. 确定数组是否完全排序
- 6. 比较Prolog中的两个列表,以确定这两个列表的等值元素是否相同计数
- 7. 确定序列中两个或多个元素是否具有相同属性
- 8. 如何确定两个电话号码是否相同?
- 9. 如何确定两个布尔表达式是否相同
- 10. 如何确定两个网页是否相同?
- 11. 确定两个资源ID是否指向相同的布局
- 12. 确定两个NFA所接受的语言是否相同
- 13. 确定两个单链表是否相同?
- 14. 如何检查两个元组列表是否相同
- 15. 检查一个数组中的两个项是否相同
- 16. 如何确定两个2维列表是完全相同的?
- 17. LINQ:确定两个序列是否包含完全相同的元素
- 18. Java:如何确定一个数组是否有两个相等的元素?
- 19. 确定阵列中的元素是否相应排列
- 20. 确定是否DataSet列完全包含相同数据
- 21. 如何使用CFML测试两个数组是否相同?
- 22. 查找两个字符串是否在数组中相同?
- 23. 如何检查两个数组是否相同?
- 24. 我的代码确定两个数组是否是排列总是返回false,为什么?
- 25. 如何检查列表中的两个数字是否相同
- 26. 确定两个方法是否具有相同的基本定义
- 27. 确定泛型类型是否相同
- 28. 确定给定圆的两个扇区是否相交?
- 29. 确定一个数组是否是关联(散列)或不
- 30. 使用散列来确定2个数据帧是否相同(PART 01)
它们是固定长度整数数组吗? – harold 2012-07-15 08:06:15