Bitmap的概念可以参考http://www.cnblogs.com/dyllove98/archive/2013/07/26/3217741.html这篇文章和维基百科
实现的精华
Bitmap的精华就在于下面这一段代码,摘抄自前面提到的文章。
#define SHIFT 5
#define MASK 0x1F
/**
* 设置所在的bit位为1
*
* T = O(1)
*
*/
void set(int n, int *arr)
{
int index_loc, bit_loc;
index_loc = n >> SHIFT; // 等价于n / 32
bit_loc = n & MASK; // 等价于n % 32
arr[index_loc] |= 1 << bit_loc;
}
n & MASK
让我联想到了Java中HashMap的size,具体可以看…
实例
用BitSet来求解LeetCode Two Sum问题
public class Solution {
public int[] twoSum(int[] numbers, int target) {
// make all numbers >= 0
int min = Integer.MAX_VALUE;
for (int n: numbers) {
if (n < min) {
min = n;
}
}
if (min < 0) {
for (int i = 0; i < numbers.length; i++) {
numbers[i] += -min;
}
target += 2 * (-min);
}
// index to return
int result1 = -1;
int result2 = -1;
// special condition
// target: 28, two of 14 in array
int halfTarget = target / 2;
if (target % 2 == 0) {
for (int i = 0; i < numbers.length; i++) {
if (numbers[i] == halfTarget) {
if (result1 == -1) {
result1 = i;
} else {
result2 = i;
return new int[]{result1, result2};
}
}
}
}
// normal condition
BitSet bitSet = new BitSet(target);
for (int i = 0; i < numbers.length; i++) {
int value = numbers[i];
// prevent a single 14 becomes the return index if target equals 28
if (value <= target && value != halfTarget) {
bitSet.set(value);
}
}
for (int i = 0; i < numbers.length; i++) {
int value = numbers[i];
if (target - value >= 0 && bitSet.get(target - value)) {
result1 = i;
}
}
int friend = target - numbers[result1];
for (int i = 0; i < numbers.length; i++) {
if (numbers[i] == friend && result1 != i) {
result2 = i;
}
}
// order answer to output
if (result1 < result2) {
return new int[]{result1, result2};
} else {
return new int[]{result2, result1};
}
}
}
速度超过了99%的玩家
参考
http://my.oschina.net/a20092173/blog/501449?p=1
http://www.cnblogs.com/dyllove98/archive/2013/07/26/3217741.html