Maximum XOR of Two Numbers in an Array解題報告

Description:

Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231.

Find the maximum result of ai XOR aj, where 0 ≤ i, j < n.

Could you do this in O(n) runtime?

Example:

Input: [3, 10, 5, 25, 2, 8]

Output: 28

Explanation: The maximum result is 5 ^ 25 = 28.

Link:

https://leetcode.com/problems/maximum-xor-of-two-numbers-in-an-array/description/

解題方法:

在解題之前棉圈,首先要了解2個事情:

  1. 兩個數(shù)XOR的結(jié)果取決于這兩位數(shù)的二進(jìn)制形式每一位是否相同畏纲。當(dāng)相同時焕檬,結(jié)果在這一位上為0;當(dāng)不同時,結(jié)果在這一位上為1。
  2. 假設(shè)我們有3個數(shù):a, b, c;當(dāng)a 和 b以及b和c在第1位上有不同時(a和c相同),那么最大的XOR只會出現(xiàn)在aXORb與bXORc之間邑时。

解題方法:

  1. 我們將數(shù)組里面的元素分組奴紧,以第一次出現(xiàn)不同的位置分為set0和set1兩組,進(jìn)入遞歸函數(shù)(set0, set1, poi - 1)晶丘;
  2. 將在set0和set1中的數(shù)根據(jù)下一位(poi)的值各自再分為兩組set01和set00, set10和set11黍氮;
  3. 當(dāng)set01和set10或者set00和set11同時存在時,意味著最大的XOR值在這一位上必定為1浅浮,在這層遞歸中最大XOR值=1<<poi + max(下一層遞歸(set01, set10, poi - 1),下一層遞歸(set00, set11, poi - 1))沫浆;如果這兩組都不存在,則將位置向右再移一位滚秩,重復(fù)進(jìn)行操作2专执;

Time Complexity:

O(N)

完整代碼:

class Solution 
{
public:
    int findMaximumXOR(vector<int>& nums) 
    {
        int result = 0;
        vector<int> set0;
        vector<int> set1;
        for(int poi = 31; poi >= 0; poi--)
        {
            set0.clear();
            set1.clear();
            for(int i: nums)
            {
                if(i & (1 << poi))
                    set1.push_back(i);
                else
                    set0.push_back(i);
            }
            if(!set0.empty() && !set1.empty())
            {
                result += (1 << poi);
                result += helper(set0, set1, poi - 1);
                break;
            }
        }
        return result;
        
    }
    int helper(vector<int>& set0, vector<int>& set1, int poi)
    {
        if(poi < 0)
            return 0;
        int result = 0;
        vector<int> set00;
        vector<int> set01;
        vector<int> set10;
        vector<int> set11;
        for(int i : set0)
        {
            if(i & (1 << poi))
                set01.push_back(i);
            else
                set00.push_back(i);
        }
        for(int i : set1)
        {
            if(i & (1 << poi))
                set11.push_back(i);
            else
                set10.push_back(i);
        }
        int temp0 = 0, temp1 = 0;
        if(!set00.empty() && !set11.empty())
        {
            temp0 = (1 << poi) +  helper(set00, set11, poi - 1);  //參數(shù)的順序不能出錯
        }
        if(!set01.empty() && !set10.empty())
        {
            temp1 =(1 << poi) + helper(set01, set10, poi - 1);  //參數(shù)的順序不能出錯
        }
        if(temp0 || temp1)
        {
            return result += max(temp0, temp1);
        }
        else
            return helper(set0, set1, poi - 1);
    }
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市郁油,隨后出現(xiàn)的幾起案子本股,更是在濱河造成了極大的恐慌,老刑警劉巖桐腌,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拄显,死亡現(xiàn)場離奇詭異,居然都是意外死亡案站,警方通過查閱死者的電腦和手機(jī)躬审,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蟆盐,“玉大人承边,你說我怎么就攤上這事∈遥” “怎么了炒刁?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長誊稚。 經(jīng)常有香客問我翔始,道長罗心,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任城瞎,我火速辦了婚禮渤闷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘脖镀。我一直安慰自己飒箭,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布蜒灰。 她就那樣靜靜地躺著弦蹂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪强窖。 梳的紋絲不亂的頭發(fā)上凸椿,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機(jī)與錄音翅溺,去河邊找鬼脑漫。 笑死,一個胖子當(dāng)著我的面吹牛咙崎,可吹牛的內(nèi)容都是我干的优幸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼褪猛,長吁一口氣:“原來是場噩夢啊……” “哼网杆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起伊滋,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤跛璧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后新啼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體追城,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年燥撞,在試婚紗的時候發(fā)現(xiàn)自己被綠了座柱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡物舒,死狀恐怖色洞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情冠胯,我是刑警寧澤火诸,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站荠察,受9級特大地震影響置蜀,放射性物質(zhì)發(fā)生泄漏奈搜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一盯荤、第九天 我趴在偏房一處隱蔽的房頂上張望馋吗。 院中可真熱鬧,春花似錦秋秤、人聲如沸宏粤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绍哎。三九已至,卻和暖如春鞋真,著一層夾襖步出監(jiān)牢的瞬間崇堰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工灿巧, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人揽涮。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓抠藕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蒋困。 傳聞我的和親對象是個殘疾皇子盾似,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容