[LeetCode解题报告] 421. 数组中两个数的最大异或值

一、 题目

1. 题目描述

给你一个整数数组 nums 以及两个整数 lowerupper 。求数组中,值位于范围 [lower, upper] (包含 lowerupper)之内的 区间和的个数

2. 原题链接

链接: 421. 数组中两个数的最大异或值

二、 解题报告

1. 思路分析

这题是01字典树的经典应用,最大异或和,只需要在搜索的时候贪心的去递归子树即可。

2. 复杂度分析

最坏时间复杂度O(nlog2n)

3.代码实现

01字典树经典应用。

class TrieNode:
    def __init__(self,cnt=0):
        self.cnt = cnt 
        self.next = [None]*2
        self.is_end = False
    def insert(self, a: int) -> None:
        cur = self
        for pos in range(31,-1,-1):
            i = (a>>pos) & 1
            if not cur.next[i] :  # 没有这个字符
                cur.next[i] = TrieNode()
            cur = cur.next[i]
            cur.cnt += 1
        cur.is_end = True

    def find(self,a):
        ret = 0
        cur = self
        for pos in range(31,-1,-1):
            i = (a>>pos) & 1
            if i == 0:
                if cur.next[1]:
                    cur = cur.next[1]
                    ret = ret*2+1
                else:
                    cur = cur.next[0]
                    ret = ret*2
            else:
                if cur.next[0]:
                    cur = cur.next[0]
                    ret = ret*2+1
                else:
                    cur = cur.next[1]
                    ret = ret*2                               
        
        return ret
class Solution:
    def findMaximumXOR(self, nums: List[int]) -> int:
        trie = TrieNode()
        # trie.insert(nums[0])
        ans = -1e13
        for num in nums:
            trie.insert(num)
            ans = max(ans,trie.find(num))

        return ans

三、 本题小结

这种题目还是找板子比较快
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值