Single Number II

来源:互联网 发布:晋江腾达陶瓷销售网络 编辑:程序博客网 时间:2024/06/05 18:52

这道题目有很多O(n)解法。

(1)可以用unordered_map。但这个很难说是O(n),哈希冲突是难以预测的,理论上可以算O(n).

class Solution {public:    int singleNumber(int A[], int n) {        if(n<=0) return -1;        unordered_map<int,int> mp;        for(int i=0;i<n;++i)            mp[A[i]]++;        for(auto p:mp){            if(p.second==1)            return p.first;        }    }};

(2)位运算,这也许是该题的本意。下面的是最容易理解的方法。统计每位出现1的次数,只出现一次的位相或起来就是唯一的书。简单,但是系数有点高。

class Solution {public:    int singleNumber(int A[], int n) {        if(n<=0) return -1;        int res=0;        for(int i=0;i<32;++i){            int cnt=0,shift=1<<i;            for(int j=0;j<n;++j)                if(A[j]&shift) cnt++;            if(cnt%3) res = res | shift;        }        return res;    }};
上面两个实现,大概都要80ms,效率算是差的。还有一种效率高的,我没实现且觉得不易理解。说明这方面的知识欠缺,等觉得容易了再来实现。
本文参考了http://blog.csdn.net/kenden23/article/details/13625297

0 0