子数组按位与值位K的数目 logTrick + 二分 leetcode 134双周赛

题目:

题解:

logTrick:在O( nlogv )的时间复杂度枚举出所有子数组按位and或or操作的值。

代码:

    //~01~泛型查找
    int lf(int l,int r,vector<int>&nums,int target){
        int mid;
        while(l<r){
            mid=(l+r)>>1;
            if(nums[mid]>=target)r=mid;
            else l=mid+1;
        }
        if(nums[l]==target)return l;
        return -1;
    }
    //~10~泛型查找
    int rf(int l,int r,vector<int>&nums,int target){
        int mid;
        while(l<r){
            mid=(l+r+1)>>1;
            if(nums[mid]<=target)l=mid;
            else r=mid-1;
        }
        return l;
    }

    long long countSubarrays(vector<int>& nums, int k) {
        long long ans=0;
        for(int i=0,I=nums.size();i<I;i++){
            for(int j=i-1;j>=0;j--){
                if((nums[j]&nums[i])==nums[j])break;
                nums[j]=(nums[i]&nums[j]);
            }
         //在这个位置可以依次得到所有子数组,且0~1为所有子数组按位and的结果,且单调递增。
         //这里在每一个子数组上找出值为k的数量,也就是有序数组中有多少个k元素。
            if(lf(0,i,nums,k)!=-1){
                ans+=rf(0,i,nums,k)-lf(0,i,nums,k)+1;
            }
        }
        return ans;
    }

题后反思:

~01~二分和~10~二分每次>>1都是将mid指针落在潜在的0的位置。

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 03:32:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 03:32:02       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 03:32:02       58 阅读
  4. Python语言-面向对象

    2024-07-17 03:32:02       69 阅读

热门阅读

  1. 【ubuntu】没有声音??连不上网络???

    2024-07-17 03:32:02       17 阅读
  2. bat 设置防火墙指定ip范围 指定时间段放行访问

    2024-07-17 03:32:02       18 阅读
  3. 微信小程序实现省市区级联选择组件

    2024-07-17 03:32:02       20 阅读
  4. Linux硬件中断(IRQ)的基础知识

    2024-07-17 03:32:02       19 阅读
  5. AI问答-供应链管理:WMS / 仓储管理

    2024-07-17 03:32:02       19 阅读
  6. 代码随想三刷图论篇2

    2024-07-17 03:32:02       21 阅读