421-maximum-xor-of-two-numbers-in-an-array

Try it on leetcode

Description

Given an integer array nums, return the maximum result of nums[i] XOR nums[j], where 0 <= i <= j < n.

 

Example 1:

Input: nums = [3,10,5,25,2,8]
Output: 28
Explanation: The maximum result is 5 XOR 25 = 28.

Example 2:

Input: nums = [14,70,53,83,49,91,36,80,92,51,66,70]
Output: 127

 

Constraints:

  • 1 <= nums.length <= 2 * 105
  • 0 <= nums[i] <= 231 - 1

Solution(Python)

class TrieNode:
    def __init__(self):
        self.left = None
        self.right = None

    def insert(self, x):
        curr = self

        for i in range(30, -1, -1):
            val = (x >> i) & 1
            if val == 0:
                if curr.left is None:
                    curr.left = TrieNode()
                curr = curr.left
            else:
                if curr.right is None:
                    curr.right = TrieNode()
                curr = curr.right


class Solution:
    def findMaximumXOR(self, nums: List[int]) -> int:
        return self.trie(nums)

    """
    Time Comnplexity: O(n^2)
    Space Complexity: O(1)
    """

    def bruteforce(self, nums: List[int]) -> int:
        n = len(nums)
        res = float("-INF")

        for i in range(n):
            for j in range(i, n):
                if nums[i] ^ nums[j] > res:
                    res = nums[i] ^ nums[j]
        return res

    """
    Time Comnplexity: O(n *log U)
    Space Complexity: O(log U)
    """

    def bitmanipul(self, nums: List[int]) -> int:
        n = len(nums)
        res = 0
        mask = 0

        s = set()
        for i in range(30, -1, -1):
            mask |= 1 << i
            tempMax = res | (1 << i)

            for num in nums:
                s.add(num & mask)

            for prefix in s:
                if tempMax ^ prefix in s:
                    res = tempMax
                    break

            s.clear()
        return res

        return res

    """
    Time Comnplexity: O(n)
    Space Complexity: O(n)
    """

    def trie(self, nums: List[int]) -> int:
        root = TrieNode()
        n = len(nums)
        for i in range(n):
            root.insert(nums[i])
        max_xor = 0
        for num in nums:
            curr_xor = 0
            M = pow(2, 30)
            curr = root
            for j in range(30, -1, -1):
                val = (num >> j) & 1
                if val == 0:
                    if curr.right is not None:
                        curr_xor += M
                        curr = curr.right
                    else:
                        curr = curr.left
                else:
                    if curr.left is not None:
                        curr_xor += M
                        curr = curr.left
                    else:
                        curr = curr.right
                M /= 2
            if curr_xor > max_xor:
                max_xor = curr_xor
        return int(max_xor)