leetcode 1248 优美子数组(滑窗)

题目大意:

有一串数an,an由0和1组成,问我们包含k个1的连续子数组的个数是多少?

解题思路:

一开始想用前缀和,发现不会用。后来发现其实只要把1的位置拿下来然后对这个数组做一个滑窗就可以得到结果。

废话:

这里我们留意一下双指针的公式,因为双指针非常常用,例如这里的滑窗,所以我们为了快速从已知两个指针的位置和两个指针指向的位置长度中的两者推出剩下一个,我们有必要背一下以下公式:

\\poi2-poi1+1=len\\ poi1+len-1=poi2\\ poi2-len+1=poi1\\

其中poi2表示右指针,poi1表示左指针,len表示这个序列的长度,其中最容易出错的是这个1是+1还是减一这里,大家要熟记。

在这里,我们需要计算在滑窗那么头指针需要滑到多远呢?

poi:0->end-k+1

其中poi表示指针,end表示数列尾,k是题目给出的。

另外,这题的把元素位置抽出来构成新数组也需要学习这种思想。

class Solution {
public:
    int numberOfSubarrays(vector<int>& nums, int k) {
        //cout<<"hello"<<endl;
        vector<int> mv;
        mv.push_back(0);
        for(int i=0;i<nums.size();i++){
            if(nums[i]%2==1)mv.push_back(i+1);
        }
        mv.push_back(nums.size()+1);
        int ans=0;
        int n=mv.size()-2;
        //cout<<n<<" "<<k<<endl;
        for(int i=1;i<=n-k+1;i++){

            int ls=i+k-1;
            //cout<<i<<" "<<ls<<endl;
            int tmpans=1;
            if(!(mv[i]-mv[i-1]-1))tmpans=mv[ls+1]-mv[ls];
            else{
            tmpans*=mv[i]-mv[i-1];
            tmpans*=mv[ls+1]-mv[ls];
            }
            ans+=tmpans;
        }
        return ans;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值