• [LeetCode] 421. 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 ≤ ij < 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.

    思路

    题意:给定一个数组,在时间复杂度为O(n)条件下求出两数异或的最大值

    题解:此方法挺巧妙的,根据异或的性质,如果 a ^ b = c,那么a = b ^ c,因此我们利用这个性质,从高位开始枚举每个数的二进制位的前缀保存下来,然后在每一轮枚举前缀的时候也正好枚举答案,然后再在这些保存下来的前缀中查找是否有两数x, y 异或得到我们枚举的答案。

    class Solution {
    public:
        //162ms
        int findMaximumXOR(vector<int>& nums) {
            int res = 0,mask = 0;
            for (int i = 31;i >= 0;i--){
                mask |= (1 << i);
                set<int>prefix;
                for (unsigned int i = 0;i < nums.size();i++){
                    prefix.insert(nums[i] & mask);
                }
                int tmp = res | (1 << i);          //从高位枚举答案
    
                //set中的数相当于a、b,tmp相当于c,我们根据tmp和set中已有的一个数异或,
                //如果得到的数也在set中,说明这两个数异或能得到tmp值,然后用tmp更新res
                for (set<int>::iterator it = prefix.begin();it != prefix.end();it++){
                    if (prefix.count(tmp^*it)){
                        res = tmp;
                        break;
                    }
                }
            }
            return res;
        }
    };
    

      

  • 相关阅读:
    PouchContainer Goroutine Leak 检测实践
    CDN全站加速助力企业云上升级
    互联网架构如何促进数字化营销
    设计模式之模板方法
    设计模式之外观模式
    设计模式之适配器模式
    分布式理论(一)CAP 理论
    边缘计算基本概念
    MQTT实战之MQTT入门
    高性能NIO通信框架之Netty架构总结(1)
  • 原文地址:https://www.cnblogs.com/ZhaoxiCheung/p/7398323.html
Copyright © 2020-2023  润新知