Loading

Java中BitSet的基本用法

JAVA中BitSet就是“位图”数据结构,根据“位图”的语义,数据的存在性可以使用bit位上的1或0来表示;一个bit具有2个值:0和1,正好可以用来表示false和true

通俗地讲,这个类中维护了一个long型(8字节)的数组,一个long占8个字节,也就是64位。

BitSet bitSet = new BitSet();
bitSet.set(0, 2, true);

上面的代码的含义是,第[0,2)位会被设置成1,也就是说这个类会自动地生成一个long型的数(words[0] = 3),这个数换成二进制的形式是 1 1

如果bitSet.set(3, 5, true); , 第[3,5)位会被设置成1, 此时words[0] = 24, 换成二进制的形式为 1 1 0 0 0

常用的方法有

int nextSetBit(int startIndex) // 返回第一个设置为 true 的位的索引,在指定的起始索引或之后的索引上
int nextClearBit(int startIndex) // 返回第一个设置为 false 的位的索引 , 在指定的起始索引或之后的索引上
void set(int index, boolean v) // 将指定索引处的位设置为指定的值
将指定索引处的位设置为 true

LeetCode 56. 合并区间 中有所应用

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。

示例 1:

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:

输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-intervals

利用了bitSet的解法:

    public int[][] merge2(int[][] intervals) {
        BitSet bitSet = new BitSet();
        int max = 0;
        for (int[] interval : intervals) {
            // 比如[1,4]和[5,6]两个区间在数轴上是不连续的,但在BitSet上却是连续的。乘2是为了让它们从BitSet上看也是不连续的
            // bitSet.set() 函数 [x,y)
            int temp = interval[1] * 2 + 1;
            bitSet.set(interval[0] * 2, temp, true);
            max = temp >= max ? temp : max;
        }

        int index = 0, count = 0;
        while (index < max) {
            int start = bitSet.nextSetBit(index);
            int end = bitSet.nextClearBit(start);

            int[] item = {start / 2, (end - 1) / 2};
            intervals[count++] = item;

            index = end;
        }
        int[][] ret = new int[count][2];
        for (int i = 0; i < count; i++) {
            ret[i] = intervals[i];
        }

        return ret;
    }
posted @ 2020-11-29 15:19  低吸埋伏  阅读(6299)  评论(0编辑  收藏  举报