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;
}