2799.统计完全子数组的数目-356

发布时间 2023-07-31 21:10:16作者: huangxk23

统计完全子数组的数目

给你一个由 正 整数组成的数组 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\)

解题思路1:暴力解

本来没想使用暴力解的,看着这个题目就像是双指针的问题。但是看着这个数据量,算了一下时间复杂度以及周赛的排名,还是默默写下了这个违背初心的解法。。。。关键:统计不同元素的数目时不要使用set,因为set的插入是O(log(n))的,需要使用map,插入的时间复杂度是O(1)的。

code1

class Solution {
public:
    //子数组的不同元素的数目和整个数组的不同元素数目相同
    //双重遍历判断是否符合条件
    
    int countCompleteSubarrays(vector<int>& nums) {
        
        int ans = 0;
        unordered_map<int,int> cnt;
        for(auto item : nums) cnt[item] ++;
        
        for(int i = 0;i < nums.size();i ++)
        {
            unordered_map<int,int> has;
            for(int j = i;j < nums.size();j ++)
            {
                has[nums[j]] ++;
                int len1 = cnt.size();
                int len2 = has.size();
                if(len1 == len2)
                {
                    ans += nums.size() - j;
                    break;
                }
            }
        }
        
        return ans;
    }
};