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