📜  数组中一对的最大OR值|套装2(1)

📅  最后修改于: 2023-12-03 15:40:02.594000             🧑  作者: Mango

数组中一对的最大OR值|套装2

介绍

本题要求在给定的数组中找到一对数,使它们进行“或”运算后的结果最大。

本题属于基础算法题目,考察的是基本的数字运算能力和算法思维能力。

算法分析
暴力算法

最简单的思路是对于数组中的每一对数进行“或”运算,得到所有可能的结果并找出最大的那个。

算法时间复杂度为 $O(N^2)$,不过由于本题数据范围较小,可以通过本题。

位运算

我们知道,一个数的二进制表示中,每一位只可能是 0 或者 1。因此,在找到数组中的最大值之后,将其与数组中的所有数分别进行“或”运算,得到的结果中,最高位为 1 的那个数就是最大的“或”。

算法时间复杂度为 $O(N)$。

代码实现
C++

暴力算法的代码实现:

int maxxor(vector<int>& nums) {
    if (nums.size() < 2) return 0;

    int ans = 0;
    for (int i = 0; i < nums.size(); ++i) {
        for (int j = i + 1; j < nums.size(); ++j) {
            ans = max(ans, nums[i] ^ nums[j]);
        }
    }

    return ans;
}

位运算的代码实现:

int maxxor(vector<int>& nums) {
    if (nums.size() < 2) return 0;

    int ans = 0;
    int max_num = *max_element(nums.begin(), nums.end());
    int mask = 1;
    while (mask < max_num) mask = (mask << 1) | 1;

    unordered_set<int> s;
    for (int i = 0; i < nums.size(); ++i) {
        int t = nums[i] ^ mask;
        if (s.count(t)) return max_num;
        s.insert(nums[i]);
    }

    int res = 0;
    for (auto& x : s) {
        for (auto& y : s) {
            res = max(res, x ^ y);
        }
    }
    return res;
}
Python

暴力算法的代码实现:

from typing import List

class Solution:
    def findMaximumXOR(self, nums: List[int]) -> int:
        if len(nums) < 2:
            return 0
        ans = 0
        for i in range(len(nums)):
            for j in range(i + 1, len(nums)):
                ans = max(ans, nums[i] ^ nums[j])
        return ans

位运算的代码实现:

from typing import List

class Solution:
    def findMaximumXOR(self, nums: List[int]) -> int:
        if len(nums) < 2:
            return 0
        ans = 0
        max_num = max(nums)
        mask = 1
        while mask < max_num:
            mask = (mask << 1) | 1
        s = set()
        for x in nums:
            t = x ^ mask
            if t in s:
                return max_num
            s.add(x)
        res = 0
        for x in s:
            for y in s:
                res = max(res, x ^ y)
        return res
总结

本题考察了基本的数字运算能力和算法思维能力,需要对位运算、哈希表等基础算法有一定的了解。

写出简洁高效的代码,需要考虑各种情况,避免因为一些特殊情况导致程序出现错误。

参考链接