文章目录
- 1. 题目
- 2. 解题
1. 题目
给定一个01数组 arr 和 一个整数 k, 统计有多少区间符合如下条件:
- 区间的两个端点都为 0 (允许区间长度为1)
- 区间内 1 的个数不多于 k
arr 的大小不超过 10^5
样例 1:
输入: arr = [0, 0, 1, 0, 1, 1, 0], k = 1
输出: 7
解释: [0, 0], [1, 1], [3, 3], [6, 6], [0, 1], [0, 3], [1, 3]
(区间 [i,j] 表示下标 i(包括)和下标 j(包括)之间的元素)样例 2:
输入: arr = [1, 1, 1, 0, 0, 1], k = 2
输出: 3
解释: [3, 3], [4, 4], [3, 4]
(区间 [i,j] 表示下标 i(包括)和下标 j(包括)之间的元素)
https://tianchi.aliyun.com/oj/286606814880453210/327250187142763356
2. 解题
- 使用队列记录队列内的 和 s, 维护 s <= k
class Solution {
public:/*** @param arr: the 01 array* @param k: the limit * @return: the sum of the interval*/long long intervalStatistics(vector<int> &arr, int k) {// Write your code here.queue<int> q;int s = 0;long long ans = 0;for(int i = 0; i < arr.size(); ++i){q.push(i);if(arr[i])s++;else//等于0,以该0为右端点的区间{while(s > k || arr[q.front()]==1)//直到 s <= k 且 左端出现 0{if(arr[q.front()]==1)s--;q.pop();}ans += i-q.front()+1 - s;//区间的长度 减去 和 s 就是零的个数}}return ans;}
};
50ms C++
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!