【发布时间】:2011-08-24 12:42:49
【问题描述】:
我正在寻找一种反转给定列表的相同实例的方法,具有 O(1) 额外空间和 O(n) 时间。
这不是硬件,我也不是在寻找一些图书馆方法来为我完成这项工作,因为这只是我自己的练习,纯粹是出于好奇。
任何想法如何用 O(1) 额外空间和 O(n) 时间做到这一点? (如果可能的话,也无需反思)?
签名是public <T> void reverse(List<T> list)。
(*)假设 get() 到列表的头部和尾部是 O(1),但到它的中间是 O(n)。
我想出了一个递归解决方案,但它是 O(n) 空间,O(n) 时间
public <T> void reverseAux(List<T> list,int size) {
if (size == 0) return;
T elem = list.remove(size-1);
reverseAux(list,size-1);
list.add(0,elem);
}
public <T> void reverse(List<T> list) {
reverseAux(list, list.size());
}
编辑:我正在寻找一个 java 解决方案,对于 List<T>,实现的唯一假设是头部和尾部的访问时间 O(1),并使用 List<T> 接口。
【问题讨论】:
-
你不能简单地从 0 迭代到 n/2 并交换 i 和 n - i 吗?在 for 循环中,而不是 foreach...
-
@Max: get() is O(n) for the middle of the list, and swapping requires me access n-i, and I get O(n^2)
-
@amit 那么我真的很抱歉...为什么不能使用具有恒定时间索引的容器?
-
你不能只是假设它是一个 Java
List<T>;这不会让你做出那些类型约束(例如,你不能假设索引是 O(n) 或其他),甚至必须修改列表根本。 :-) -
@amit:在这种情况下,我认为您应该问有关单链表的问题,而不是问有关
List接口的问题,我认为这很明显是为了表示“最坏”的双向链表。