给定一个只读数组,包含n个元素,找到该数组的中位数(按大小排列为第ceiling(n/2)个元素),要求空间复杂度为O(logn),平均时间复杂度为O(nlogn)。
- 数组中的元素互不相同。
- 数组未排序。
- 不能更改数组中的任何值,只能读取它们。
我考虑使用快速排序的思想,但是在不更改数组的情况下执行此操作是不可能的。将其复制到另一个数组中会超出所需的空间。
我考虑使用快速排序的思想,但是在不更改数组的情况下执行此操作是不可能的。将其复制到另一个数组中会超出所需的空间。
O(1)
的额外内存,但如果你将其转移到递归调用中,并且没有将其优化为尾递归,则会有 O(logn)
个递归调用,每个调用都会将一些变量推入调用栈,这将给你带来 O(logn)
的空间。 - amit这里有一个简单的算法。它通过跟踪中位数所在区间的下限和上限来搜索中位数。
设E为元素列表。将中位数的下限和上限L和U设置为null。
对于E中的每个元素e,
空间复杂度为O(1)。时间复杂度最多为O(n2),平均为O(nlogn)。
示例:
E = [2 4 7 9 0 6 5]
L,U = null,null Initial state.
e = 2 L,U = 2,null Update L.
e = 4 L,U = 4,null Update L.
e = 7 L,U = 4,7 Update U.
e = 9 L,U = 4,7 Skip 9.
e = 0 L,U = 4,7 Skip 0.
e = 6 L,U = 4,6 Update U.
e = 5 Median is 5 Terminate.
目前的写法很难确定你在问什么
问题陈述非常清晰。原帖作者展示了他的两种方法,并解释了它们为什么失败(证明了自己进行了研究)。如果有一个关闭投票者能够解释他们的理由,那将会很高兴。 - amit