leetcode 2799. 统计完全子数组的数目 中等

给你一个由 整数组成的数组 nums

如果数组中的某个子数组满足下述条件,则称之为 完全子数组

  • 子数组中 不同 元素的数目等于整个数组不同元素的数目。

返回数组中 完全子数组 的数目。

子数组 是数组中的一个连续非空序列。

示例 1:

复制代码
输入:nums = [1,3,1,2,2]
输出:4
解释:完全子数组有:[1,3,1,2]、[1,3,1,2,2]、[3,1,2] 和 [3,1,2,2] 。

示例 2:

复制代码
输入:nums = [5,5,5,5]
输出:10
解释:数组仅由整数 5 组成,所以任意子数组都满足完全子数组的条件。子数组的总数为 10 。

提示:

  • 1 <= nums.length <= 1000
  • 1 <= nums[i] <= 2000

分析:使用滑动窗口来解决这个问题。用一个 flag 数组,记录对应的元素是否出现过,并用 cnt 记录出现过不同的元素数量。之后遍历数组,用 temp 数组记录已经出现过哪些元素,每出现过一个元素, cnt 的值减 1。

初始时,窗口的左端点 L = 0。当 cnt 等于 0 时,说明从 L 到当前位置 index 的子数组是完全子数组,且从 index 到 nums 数组末尾的所有子数组也都满足完全子数组的条件,因此 ans += numsSize - index。之后要将窗口的左端点 L 向右移动,直到从 L 到 index 的子数组不满足条件。每次移动时,若仍然满足条件,ans 还要加上 numsSize - index。这样遍历完整个数组即可得到答案。

cpp 复制代码
int countCompleteSubarrays(int* nums, int numsSize) {
    int ans,l,r,cnt;cnt=ans=l=r=0;
    int flag[2020]={0},temp[2020]={0};
    for(int i=0;i<numsSize;++i)
        if(!flag[nums[i]])flag[nums[i]]++,cnt++;

    for(int i=0;i<numsSize;++i)
    {
        temp[nums[i]]++;
        if(temp[nums[i]]==flag[nums[i]])cnt--;
        
        if(cnt==0)
        {
            ans+=numsSize-i;
            //printf("ans=%d i=%d add=%d\n",ans,i,numsSize-i);
            for(;l<=i;++l)
            {
                temp[nums[l]]--;
                if(temp[nums[l]]<flag[nums[l]])
                {
                    l++;cnt++;break;
                }
                else ans+=numsSize-i;
                //printf("for ans=%d l=%d \n",ans,l);
            }
            //printf("ans=%d l=%d \n",ans,l);
        }
    }

    return ans;
}
相关推荐
老鼠只爱大米9 小时前
LeetCode经典算法面试题 #114:二叉树展开为链表(递归、迭代、Morris等多种实现方案详细解析)
算法·leetcode·二叉树·原地算法·morris遍历·二叉树展开
参.商.9 小时前
【Day25】26.删除有序数组中的重复项 80.删除有序数组中的重复项II
leetcode·golang
执着25910 小时前
力扣hot100 - 144、二叉树的前序遍历
数据结构·算法·leetcode
散峰而望10 小时前
【算法竞赛】树
java·数据结构·c++·算法·leetcode·贪心算法·推荐算法
Anastasiozzzz11 小时前
LeetCode hot100 45 跳跃游戏2
算法·leetcode·游戏
Tisfy11 小时前
LeetCode 3013.将数组分成最小总代价的子数组 II:两个堆维护k-1小 + 滑动窗口
算法·leetcode·题解·优先队列··有序集合·滑动窗口
季明洵11 小时前
反转字符串、反转字符串II、反转字符串中的单词
java·数据结构·算法·leetcode·字符串
后来后来啊12 小时前
2026.2.2 & 2.3学习笔记
数据结构·笔记·学习·算法·leetcode
YuTaoShao13 小时前
【LeetCode 每日一题】3013. 将数组分成最小总代价的子数组 II
算法·leetcode·职场和发展
爱尔兰极光13 小时前
LeetCode 热题 100--字母异位词分组
算法·leetcode·职场和发展