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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM