树状数组 lowbit 解力扣

本文介绍了树状数组这一数据结构,用于动态维护数组的前缀和,提供O(logN)的更新和查询效率。通过lowbit方法实现快速更新和查询,适用于解决区间统计问题。在给定的LeetCode1893题目中,展示了树状数组如何解决区间覆盖检查。
摘要由CSDN通过智能技术生成

这题可用树状数组来解:力扣1893

什么是树状数组

定义有点小多,
参照这篇文章树状数组 数据结构详解与模板,看前面的介绍即可;

树状数组干啥的

经过巧妙复杂的数据结构,可以以O(lgN)的复杂度获得动态数组的前缀和(不用这个结构的话,动态更新数组,计算前缀和需要O(n)的复杂度),原因参照定义;

	//树状数组的实现代码,lowbit,update,query是一定要实现的

	//new 一个树状数组
	int n = 51;
    int[] tree = new int[n];

	//输出i的2进制数最后一位1所在位置的大小
    int lowbit(int i){
        return i&(-i);
    }
	
	//动态更新树状数组 复杂度O(lgN)
    void update(int index,int v){
        for(int i=index; i<n; i+=lowbit(i)){
            tree[i] += v;
        }
    }

	//获取树状数组前缀和 复杂度O(lgN)
    int query(int index){
        int ans = 0;
        for(int i=index; i>0; i-=lowbit(i)){
            ans += tree[i];
        }
        return ans;
    }

说说lowbit方法

该方法的功能是返回一个数二进制最低位1所在位置的大小;

举个栗子,

  • 3的二进制11,输入lowbit返回的是1->二进制1
  • 6的二进制110,输入lowbit返回的是2->二进制10
  • 12的二进制1100,输入lowbit返回的是4->二进制100

那为什么**i&(-i)**就能等得到最低位1呢?

因为利用了负数补码的原理,负数要取反加一。一个数经过取反加一操作后,最后一位1还是1,其它位全部相反。所以i&(-i)得到的是最低位1的大小;
举个栗子,
数字6的二进制110,
取反加一后成为010
只有最后一位1是不变的。

完整题解

class Solution {
    int n = 51;
    int[] tree = new int[n];

    int lowbit(int i){
        return i&(-i);
    }

    void update(int index,int v){
        for(int i=index; i<n; i+=lowbit(i)){
            tree[i] += v;
        }
    }

    int query(int index){
        int ans = 0;
        for(int i=index; i>0; i-=lowbit(i)){
            ans += tree[i];
        }
        return ans;
    }

    public boolean isCovered(int[][] ranges, int left, int right) {
        Set<Integer> set = new HashSet<>();
        for(int[] range:ranges){
            for(int l=range[0]; l<=range[1]; l++){
                if(!set.contains(l)){
                    update(l,1);
                    set.add(l);
                }
            }
        }
        return query(right)-query(left-1) == right-left+1;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值