Lintcode 84
这一天,我对着lintcode说,随便给我来一题吧!然后给了我这个题目ヽ(・ω・´メ)
已知:
给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字。
思路:
这道题中,所有数字出现的次数只能为1或者2,且只有两个1,剩下均为2。基础思路其实也很简单,我们遍历数组中的所有数据,并生成一个结果的List。
- 如果List中已经含有当前遍历的元素,则将list中该元素去除。
- 否则,将该元素加入到list之中。
当然,作为初始思路,其实复杂度已经比较低了,但是,Lintcode娘认为我的代码时间复杂度还是高了。
起初的代码,就是按照上面思路,用的集合是ArrayList. 当被提示时间复杂度过高的时候,我就在想,是不是找元素的时间复杂度过高?(如果不存在该元素,则需要遍历整个List,就算有,平均也要遍历半个List)
所以,在找寻排序的List结构无果之后,我使用了TreeSet来存放数据,因为每个元素出现次数最多为2,所以Set结果并不会出错(如果可以为3,5,7这样的奇数,则Set结构是不能使用的)
代码如下:
public class Solution {
public List<Integer> singleNumberIII(int[] A) {
System.out.println(A.length);
Set<Integer> ret = new TreeSet<Integer>();
for (int num : A) {
if (ret.contains(num)) {
ret.remove(num);
} else {
ret.add(num);
}
}
return new ArrayList<Integer>(ret);
}
}
谢谢您的阅读,希望对您有所帮助(。-ω-)