资讯专栏INFORMATION COLUMN

Leetcode[421] Maximum XOR of Two Numbers in an Arr

cocopeak / 1305人阅读

摘要:复杂度思路利用的性质,则有,且所以每次从高位开始,到某一位为止,所能获得的最大的数。设置变量用来表示能形成的值,每一次将和其他的相与得到的值加入,表示在当前这一位上,数组里有这么多。

LeetCode[421] Maximum XOR of Two Numbers in an Array
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.
BitSet+HashSet

复杂度
O(N), O(N)

思路
利用XOR的性质,a^b = c, 则有 a^c = b,且 b^c = a;
所以每次从高位开始,到某一位为止,所能获得的最大的数。设置变量mask用来表示能形成的值,每一次将mask和其他的num相与得到的值加入set,表示在当前这一位上,数组里有这么多prefix。

假定在某一位上的任意两数xor能得到的最大值是tmp,那么他一定满足a(xor)b = tmp,其中set.contains(a) && set.contains(b). 所以,我们只需要判断b(xor)tmp的结果是不是在当前这一位下的set内,就可以知道这个tmp能不能又这个set中的任意两个数组成。

代码

    public int findMaximumXOR(int[] nums) {
        int max = 0, mask = 0;
        // test each bit pose, 判断能不能构成所需要的值;
        for(int i = 31; i >= 0; i --) {
            // 每次都在之前的基础上更新mask
            mask = mask | (1 << i);
            Set set = new HashSet<>();
            for(int num : nums) {
                // add the number which has the mask as its prefix;
                set.add(num & mask);
            }
            // 假设当前所能达到的最大值是这个temp值;
            int tmp = max | (1 << i);
            for(Integer prefix : set) {
                if(set.contains(prefix ^ tmp)) {
                    // 如果能组成就直接break 
                    max = tmp;
                    break;
                }
            }
        }
        return max;
    }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66227.html

相关文章

  • 【7 kyu】Sum of two lowest positive integers

    摘要:原题目题目有一个不少于四个元素的数组,计算其中两个最小值的和。对比我写的方法比较常规,中采用了的解构赋值和箭头函数 原题目 Create a function that returns the sum of the two lowest positive numbers given an array of minimum 4 integers. No floats or empty ...

    fjcgreat 评论0 收藏0
  • You need to know curry

    Functions are first-class citizen Functions are first-class citizen in JavaScript, as the same as other types(e.g. number, array, object). They can be used as arguments, as well as return value from o...

    BigNerdCoding 评论0 收藏0
  • 【LC总结】K Sum (Two Sum I II/3Sum/4Sum/3Sum Closest)

    摘要:找符合条件的总数。双指针区间考虑边界,长度,为空,等。之后的范围用双指针和表示。若三个指针的数字之和为,加入结果数组。不要求,所以不用判断了。同理,头部两个指针向后推移,后面建立左右指针夹逼,找到四指针和为目标值的元素。 Two Sum Problem Given an array of integers, find two numbers such that they add up ...

    awesome23 评论0 收藏0
  • JavaScript30秒, 从入门到放弃之Array(三)

    摘要:否则,直接循环去拼接该值返回按照指定的方法对数组元素进行分组归类。使用创建一个对象,对象的键是生成的结果,值是符合该键的所有数组元素组成的数组。微信公众号秒,从入门到放弃之三 原文链接:JavaScript30秒, 从入门到放弃之Array(三)水平有限,欢迎批评指正 flattenDepth Flattens an array up to the specified depth....

    FrancisSoung 评论0 收藏0
  • 一次掌握 JavaScript ES5 到 ES8 数组内容

    摘要:可选到该位置前停止读取数据,默认等于数组长度。找出第一个符合条件的数组元素,参数是一个回调函数,所有数组元素依次执行该回调函数,直到找出第一个返回值为的元素,然后返回该元素。回调函数可以接受三个参数,依次为当前的值当前的位置和原数组。 ECMAScript 5.1 中提供的数组方法 ECMA-262/5.1 规范 判断是否是数组 Array.isArray ( arg ) // fal...

    baiy 评论0 收藏0
  • Hackerrank Practice

    摘要:数组中重复元素的个数题目找到一个数组中重复元素的个数。能否成为题目互减,直到的时候。此方法精彩此方法更精彩找两边相等的 Anagram 拆分数组 看一半操作几次能成为另一半的anagram 题目 输入第一行是要判断的字符串的个数n,之后的n行输入为需要判断的字符串。每个字符串str,是两个等长字符串的合体,所以长度一定是偶数。若为奇数,返回-1。所以str分成两个substring,右...

    arashicage 评论0 收藏0

发表评论

0条评论

cocopeak

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<