C语言 | Leetcode C语言题解之第421题数组中两个数的最大异或值

题目:

题解:

cpp 复制代码
const int HIGH_BIT = 30;

struct Trie {
    // 左子树指向表示 0 的子节点
    struct Trie* left;
    // 右子树指向表示 1 的子节点
    struct Trie* right;
};

struct Trie* createTrie() {
    struct Trie* ret = malloc(sizeof(struct Trie));
    ret->left = ret->right = NULL;
    return ret;
}

void add(struct Trie* root, int num) {
    struct Trie* cur = root;
    for (int k = HIGH_BIT; k >= 0; --k) {
        int bit = (num >> k) & 1;
        if (bit == 0) {
            if (!cur->left) {
                cur->left = createTrie();
            }
            cur = cur->left;
        } else {
            if (!cur->right) {
                cur->right = createTrie();
            }
            cur = cur->right;
        }
    }
}

int check(struct Trie* root, int num) {
    struct Trie* cur = root;
    int x = 0;
    for (int k = HIGH_BIT; k >= 0; --k) {
        int bit = (num >> k) & 1;
        if (bit == 0) {
            // a_i 的第 k 个二进制位为 0,应当往表示 1 的子节点 right 走
            if (cur->right) {
                cur = cur->right;
                x = x * 2 + 1;
            } else {
                cur = cur->left;
                x = x * 2;
            }
        } else {
            // a_i 的第 k 个二进制位为 1,应当往表示 0 的子节点 left 走
            if (cur->left) {
                cur = cur->left;
                x = x * 2 + 1;
            } else {
                cur = cur->right;
                x = x * 2;
            }
        }
    }
    return x;
}

int findMaximumXOR(int* nums, int numsSize) {
    struct Trie* root = createTrie();
    int x = 0;
    for (int i = 1; i < numsSize; ++i) {
        // 将 nums[i-1] 放入字典树,此时 nums[0 .. i-1] 都在字典树中
        add(root, nums[i - 1]);
        // 将 nums[i] 看作 ai,找出最大的 x 更新答案
        x = fmax(x, check(root, nums[i]));
    }
    return x;
}
相关推荐
雨落在了我的手上16 小时前
C语言趣味小游戏----扫雷游戏
c语言·游戏
Qiuner17 小时前
《掰开揉碎讲编程-长篇》重生之哈希表易如放掌
数据结构·算法·leetcode·力扣·哈希算法·哈希·一文读懂
71-317 小时前
C语言——关机小程序(有system()和strcmp()函数的知识点)
c语言·笔记·学习
_Hansen_17 小时前
【C】利用GCC扩展属性进行格式化字符串的静态检查
c语言·产品安全
缓风浪起18 小时前
【力扣】2011. 执行操作后的变量值
算法·leetcode·职场和发展
云知谷1 天前
【C++基本功】C++适合做什么,哪些领域适合哪些领域不适合?
c语言·开发语言·c++·人工智能·团队开发
电子_咸鱼1 天前
LeetCode——Hot 100【电话号码的字母组合】
数据结构·算法·leetcode·链表·职场和发展·贪心算法·深度优先
仰泳的熊猫1 天前
LeetCode:785. 判断二分图
数据结构·c++·算法·leetcode
微笑尅乐1 天前
中点为根——力扣108.讲有序数组转换为二叉搜索树
算法·leetcode·职场和发展
夏鹏今天学习了吗1 天前
【LeetCode热题100(46/100)】从前序与中序遍历序列构造二叉树
算法·leetcode·职场和发展