Bitmap

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值