新农上路
- 积分
- 98
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2014-4-9
- 最后登录
- 1970-1-1
|
觉得可以用java的TreeMap<K, V>(Java里面TreeMap实现基于Red-Black Tree),或者其他语言的BST结构,每个Node都是个<K, V> entry, K是数组里的这个element,V是这个element出现的次数。
先把所有element和出现次数存到Map里面。
然后iterate through这个Map:. 1point 3 acres
int cnt = 0;
for (int each : map.keySet()) {
if (map.containsKey(K - each)) {
cnt += map.get(each) * map.get(K - each);
}
}
return cnt;
这就行了。。
. 1point3acres
因为是java TreeMap基于BST的实现,所以基本操作时间都是O(lgn),所以总的时间是O(n * lgn);
空间的话,题目说space worst case O(n),而用BST结构没有额外空间消耗,所以空间也是O(n),符合要求(Hash等结构的map不能用,因为Hash结构有额外空间消耗,而且比较大,肯定不是O(n))。
但是问题在于,不知道java Collections里面,TreeMap虽然理论上空间消耗,基于BST/RBT,是O(n),但不知道java语言实现细节方面,会不会有其他消耗,会不会空间就能达到O(n)。。。
所以,有人知道不用容器或者其他什么数据结构,就用数组操作,时间O(nlgn),空间O(n)的方法吗??? |
|