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
posted @ 2022-10-22 09:55  ghosteq  阅读(21)  评论(0)    收藏  举报