LeetCode 421. 数组中两个数的最大异或值

刺骨的言语ヽ痛彻心扉 2022-10-29 14:26 254阅读 0赞

在这里插入图片描述
官方

  1. class TrieNode {
  2. HashMap<Character, TrieNode> children = new HashMap<Character, TrieNode>();
  3. public TrieNode() {
  4. }
  5. }
  6. class Solution {
  7. public int findMaximumXOR(int[] nums) {
  8. // Compute length L of max number in a binary representation
  9. int maxNum = nums[0];
  10. for(int num : nums) maxNum = Math.max(maxNum, num);
  11. int L = (Integer.toBinaryString(maxNum)).length();
  12. // zero left-padding to ensure L bits for each number
  13. int n = nums.length, bitmask = 1 << L;
  14. String [] strNums = new String[n];
  15. for(int i = 0; i < n; ++i) {
  16. strNums[i] = Integer.toBinaryString(bitmask | nums[i]).substring(1);
  17. }
  18. TrieNode trie = new TrieNode();
  19. int maxXor = 0;
  20. for (String num : strNums) {
  21. TrieNode node = trie, xorNode = trie;
  22. int currXor = 0;
  23. for (Character bit : num.toCharArray()) {
  24. // insert new number in trie
  25. if (node.children.containsKey(bit)) {
  26. node = node.children.get(bit);
  27. } else {
  28. TrieNode newNode = new TrieNode();
  29. node.children.put(bit, newNode);
  30. node = newNode;
  31. }
  32. // compute max xor of that new number
  33. // with all previously inserted
  34. Character toggledBit = bit == '1' ? '0' : '1';
  35. if (xorNode.children.containsKey(toggledBit)) {
  36. currXor = (currXor << 1) | 1;
  37. xorNode = xorNode.children.get(toggledBit);
  38. } else {
  39. currXor = currXor << 1;
  40. xorNode = xorNode.children.get(bit);
  41. }
  42. }
  43. maxXor = Math.max(maxXor, currXor);
  44. }
  45. return maxXor;
  46. }
  47. }

发表评论

表情:
评论列表 (有 0 条评论,254人围观)

还没有评论,来说两句吧...

相关阅读