leetcode-统计最大元素出现至少 K 次的子数组

https://leetcode.cn/problems/count-subarrays-where-max-element-appears-at-least-k-times/description/
给你一个整数数组 nums 和一个 正整数 k 。
请你统计有多少满足「nums 中的最大元素」至少出现 k 次的子数组,并返回满足这一条件的子数组的数目。
子数组是数组中的一个连续元素序列。

示例 1:
输入:nums = [1,3,2,3,3], k = 2
输出:6
解释:包含元素 3 至少 2 次的子数组为:[1,3,2,3]、[1,3,2,3,3]、[3,2,3]、[3,2,3,3]、[2,3,3] 和 [3,3] 。

示例 2:
输入:nums = [1,4,2,1], k = 3
输出:0
解释:没有子数组包含元素 4 至少 3 次。

提示:
1<=nums.length<=105
1<=nums[i]<=106
1<=k<=105

class Solution {
public:
    long long countSubarrays(vector<int>& nums, int k) {
        int n=nums.size();
        int ma=0;
        for(int i=0;i<n;i++){
            ma=max(ma,nums[i]);
        }
        vector<int> t;
        for(int i=0;i<n;i++){
            if(nums[i]==ma){
                t.push_back(i+1);
            }
        }
        if(t.size()<k){
            return 0;
        }
        long long ans=0;
        ans+=(t[0]-1ll)*(n-t[k-1]+1);
        ans+=(n-t[k-1]+1);
        cout<<ans<<endl;
        int m=t.size();
        for(int i=1;i<m;i++){
            if((i+k-1)>=m){
                break;
            }
            ans+=1ll*(t[i]-t[i-1])*1ll*(n-t[i+k-1]+1);
        }
        return ans;
    }
};
posted @   lipu123  阅读(19)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
历史上的今天:
2020-12-13 线段树维护区间最大值和最小值
2020-12-13 位运算&1
点击右上角即可分享
微信分享提示