位图的原理:当我们来记录一组0~n的数时,我们可以用哈希表来记录,但每记录一个数字,就会
使用一个int型;其实我们可以用一个int型的32位来表示32个数,如果有对应位上就标为1,没有
就为0;然而如果想表示超过31的数该怎么办呢?我们可以用多个int拼接表示,例如当我们要记录
33时,我们可以再第二个int型的第2个bit位上标为1。
说完位图的大体原理,再来说说具体该怎么操作:
1.该创建多少int型?
如果只有1个数,我们只需1个整形;如果有32个数,也只需要1个整形。所以只需要n/32向上取整
个数的整形。对于向上取整,如果a和b为非负数,可以采用(a+b-1)/b的写法,所以需要创建
(n+31)/32个int
2.当要处理一个数时,怎样找到对应的位置?
例如,我们要处理64这个数,首先我们要先找到64所在的整形数,第1个int表示0~31,第二个表示
32~63,所以64在第三个int上,其对应的int的下标为64/32;找到对应的int,再应该找其在int的
哪个位上,在n%32上。
3.具体的操作
1)将n加入到位图里:
int add(int n){
int pos1=n/32;
int pos2=n%32;
s[pos1]|=1<<pos2;//s是int的集合
}
2)将n移除:
int remove(int n){
int pos1=n/32;
int pos2=n%32;
s[pos1]&=~(1<<pos2);
}
3)翻转n:
int reverse(int n){
int pos1=n/32;
int pos2=n%32;
s[pos1]^=1<<pos2;
}
4)判断是否存在n:
bool contain(int n){
int pos1=n/32;
int pos2=n%32;
return s[pos1]>>pos2&1;
}
以上是一些基本的操作,还有可以有一些拓展的功能,可参考leetcode 设计位集