LeetCode题目总结——位运算

本文介绍了如何利用位运算技巧解决LeetCode中的问题,如快速代替除法和求解最大异或值。通过字典树实现的Trie查找算法,展示了如何在数组查询中寻找与数组元素的最大异或值。重点讲解了取最后一位1的操作、异或运算及其在算法中的应用。
摘要由CSDN通过智能技术生成

LeetCode题目总结——位运算

1. 代替除法

  1. 0029 - 两数相除

2. 最大异或值

建立0-1字典树,将每个数字从高位开始,依次分叉放入字典树。搜索时,优先匹配高位不同的分支。
比如数字5(0101):
建立时的分支流向:0->1->0->1
搜索时的分支流向:1->0->1->0

struct Node {
	int val = -1;
	Node* n[2];
};

class TrieTree {
public:
	void Add(int val) {
		Node* root = &node;
		for (int i = 1 << 30; i > 0; i >>= 1) {
			int idx = val & i ? 1 : 0;
			if (root->n[idx] == nullptr) root->n[idx] = new Node();
			root = root->n[idx];
		}
		root->val = val;
	}
	
	int Get(int val) {
		Node* root = &node;
		for (int i = 1 << 30; i > 0; i >>= 1) {
			if ((val & i) && (root->n[0] != nullptr)) {
				root = root->n[0];
			}
			else {
				root = root->n[1];
			}
			if (root == nullptr) {
				return -1;
			}
		}
		return root->val;
	}
	
	Node node;
};
  1. 周赛221 - 5640 - 与数组中元素的最大异或值
    将数组进行排序,对查询数组按照查询范围进行排序,遍历查询数组,根据查询数组的限制范围,依次将数组中的数字加入Trie树,然后使用当前查询值在Trie树中查询最大异或值即可。

一些基本操作

  1. 取最后一位1的位置:
x = x & -x
  1. 最后一位1置0:
x = x & (x - 1)
  1. 格雷编码:
x = i ^ (i >> 1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值