每周一道leetcode—— 260. Single Number III

題目

給定一個數組,在這個數組中,包含了一些整形數字,除了有兩個數字重復了一次,其他數字都重復了兩次。找出這兩個數字。空間復雜度盡可能做到O(1)。

分析

盡管解決方案中要求空間復雜度為O(1),這個方法確實有點復雜和難想,而且很難寫出常數小的算法。
感受異或的神奇
上面這個鏈接中給出了這道題的標準做法。在這個方法中,首先將所有字母進行異或操作,然后,結果就是兩個只出現了一次的數字的異或。這個數字的每一位1意味著這兩個數字的哪幾位是不同的。任取一位,在這一位上,將數組分為兩類,一類是這一位上是1,另一類是這一位上是0,這樣對這兩個數組分別異或結果就是這兩個數字了。

這利用了異或的性質。

a ^ b ^ c = a ^ c ^ b
a ^ a = 0
0 ^ a = a
a ^ b = c => a ^ c = b

運行13ms,擊敗68%提交。

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        int axorb = 0, last = 0;
        vector<int> ret(2, 0);
        
        for(auto it = nums.begin(); it!=nums.end() ; it++)
        {
            axorb ^= *it;
        }
        
        last = axorb & (~(axorb - 1));
        
        for(auto it = nums.begin(); it!=nums.end() ; it++)
        {
            if ((last & *it) != 0)
                ret[0] ^= *it;
        }
        
        ret[1] = axorb ^ ret[0];
        
        return ret;
    }
};

其他方法

如果不要求空間復雜度為常數,其實也可以用哈希表來做。這樣算法的擴展性很好,而且也不晦澀。

運行16ms,擊敗%34提交

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        unordered_set<int> buff(nums.size());
        for(auto i = nums.begin(); i!=nums.end() ; i++)
        {
            auto it = buff.find(*i);
            if(it == buff.end()){
                buff.insert(*i);
            }
            else{
                buff.erase(it);
            }
        }
        vector<int> ret;
        for(const int & i : buff){
            ret.push_back(i);
        }
        return ret;
    }
};
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 【1】7,9,-1,5,( ) A、4;B、2;C、-1;D、-3 分析:選D,7+9=16;9+(-1)=8;(...
    Alex_bingo閱讀 19,790評論 1 19
  • 你眼中的三亞可能是這樣的 吃早茶,看海景 沐浴陽光 享受椰風 其實,它可以是這樣的 走街串巷 吆喝聲,叫賣聲 聲聲...
    旅道天下閱讀 525評論 0 0
  • 1.有多少老人總覺得自己的子女后人比起別人的子女后人要優(yōu)秀要有教養(yǎng),總覺得別人家的蠢,不聰明,別人家的比不上自己家...
    9f867c0ed88a閱讀 395評論 0 0
  • 一位讀者后臺和我說,他失戀了。 是的,七年感情轉瞬即逝,還沒來得及幻想未來的模樣,它就不辭而別。 你走的那天,我滿...
    李文晴閱讀 847評論 0 1

友情鏈接更多精彩內容