LintCode-1667区间统计
描述
给定一个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(包括)之间的元素)
AC-Code
动态规划的思路
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.
// if(!k){return 0;}
// vector<long long> dp(arr.size(),0);
vector<long long> dp(2,0);
long long t=arr[0],l=1,index=1;
dp[0]=!t;
for(int i=1;i<arr.size();++i){
t+=arr[i];
l++;
while(l>0&&t>k){
t-=arr[i-l+1];
// cout<<t<<endl;
--l;
}
if(arr[i])dp[index%2]=dp[(index+1)%2];
else dp[index%2]=dp[(index+1)%2]+l-t;
index++;
}
// cout<<endl;
// for(int i:dp)cout<<i<<endl;
return dp[(index+1)%2];
}
};
官方的题解
采用同向双指针的思路
CPP
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) {
int left = 0;
int right = 0;
int number = 0;
int flag = 0;
long answer = 0;
int length = arr.size();
while (left < length) {
while (left < length && arr[left] != 0) {
left += 1;
number -= 1;
}
if (flag == 0) {
flag = 1;
right = left;
number = 0;
}
while (right < length - 1 && number <= k) {
right += 1;
if (arr[right] == 1) {
number += 1;
}
}
if (left < length) {
answer += right - left - number + 1;
}
left += 1;
}
return answer;
}
};
JAVA
public class Solution {
/**
* @param arr: the 01 array
* @param k: the limit
* @return: the sum of the interval
*/
public long intervalStatistics(int[] arr, int k) {
int left = 0;
int right = 0;
int number = 0;
int flag = 0;
long answer = 0;
int length = arr.length;
while (left < length) {
while (left < length && arr[left] != 0) {
left += 1;
number -= 1;
}
if (flag == 0) {
flag = 1;
right = left;
number = 0;
}
while (right < length - 1 && number <= k) {
right += 1;
if (arr[right] == 1) {
number += 1;
}
}
if (left < length) {
answer += right - left - number + 1;
}
left += 1;
}
return answer;
}
}
PYTHON
class Solution:
"""
@param arr: the 01 array
@param k: the limit
@return: the sum of the interval
"""
def intervalStatistics(self, arr, k):
left, right, number, flag, answer= 0, 0, 0, 0, 0
length = len(arr)
while left < length:
while left < length and arr[left] != 0:
left += 1
number -= 1
if flag == 0:
flag, right, number = 1, left, 0
while right < length - 1 and number <= k:
right += 1
number += 1 if arr[right] == 1 else 0
if left < length:
answer += right - left - number + 1
left += 1
return answer
本文来自博客园,作者:ghosteq,转载请注明原文链接:https://www.cnblogs.com/ghosteq/articles/16815419.html

浙公网安备 33010602011771号