Bitmap

来源:互联网 发布:javascript 构造函数 编辑:程序博客网 时间:2024/05/17 04:48

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

0 0