落单的数III

Lintcode 84

这一天,我对着lintcode说,随便给我来一题吧!然后给了我这个题目ヽ(・ω・´メ)

已知:

给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字。

思路:

这道题中,所有数字出现的次数只能为1或者2,且只有两个1,剩下均为2。基础思路其实也很简单,我们遍历数组中的所有数据,并生成一个结果的List。
 - 如果List中已经含有当前遍历的元素,则将list中该元素去除。
 - 否则,将该元素加入到list之中。

当然,作为初始思路,其实复杂度已经比较低了,但是,Lintcode娘认为我的代码时间复杂度还是高了。

起初的代码,就是按照上面思路,用的集合是ArrayList. 当被提示时间复杂度过高的时候,我就在想,是不是找元素的时间复杂度过高?(如果不存在该元素,则需要遍历整个List,就算有,平均也要遍历半个List)
所以,在找寻排序的List结构无果之后,我使用了TreeSet来存放数据,因为每个元素出现次数最多为2,所以Set结果并不会出错(如果可以为357这样的奇数,则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);
    }
}

谢谢您的阅读,希望对您有所帮助(。-ω-)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值