当前位置: 首页 > news >正文

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

 解题思路

当数组长度越长时,显然越容易满足题意。对于这种问题,要用滑动窗口来解决。

枚举右端点r,同属用哈希表存储。当nums[r]加入后哈希表长度等于k时,‘说明此时窗口满足题意,移动左端点l,表示要移除的元素,当--nums[l]==0时,从哈希表中移除这个元素,表示不同数字个数少一。

内层循环结束后,ans+=left。因为数组长度越长越容易符合题意,所以left-1到0的位置都是符合题意的子数组。一共有left个。

 小技巧,统计nums中不同数字个数的方法

unordered_set<int> st(nums.begin(),nums.end());
int k = st.size();

完整代码

class Solution {
public:int countCompleteSubarrays(vector<int>& nums) {unordered_set<int> st(nums.begin(),nums.end());int k = st.size();unordered_map<int,int> cnt;int ans = 0,left = 0;for(int x : nums){cnt[x]++;while(cnt.size() == k){//当窗口中不同数字的个数符合要求时//缩小窗口int out = nums[left];if(--cnt[out] == 0){cnt.erase(out);}left++;}ans += left;//}return ans;}
};

相关文章:

  • 硅基计划 学习总结 拾
  • 在 cmd shell 中执行 metasploit vbs payload
  • SpringBoot自动配置
  • 【UserDetailsService】
  • [Windows] MousePlus 5.5.9
  • 软考-软件设计师中级备考 4、数据结构
  • 关于 【Spring Boot Configuration Annotation Processor 未配置问题】 的详细分析、解决方案及代码示例
  • 【“星瑞” O6 评测】 — CPU llama.cpp不同优化速度对比
  • 数据结构算法竞赛训练网站OJ(Online Judge)
  • SDC命令详解:使用get_clocks命令进行查询
  • 【Java】 使用 HTTP 响应状态码定义web系统返回码
  • iView Table 组件跨页选择功能实现文档
  • vLLM技术解析:大语言模型推理服务的性能革新引擎
  • 算法相关概念
  • 【LLM开发】Unigram算法
  • 解密面试高频题:加权轮询负载均衡算法 (Java 实现)
  • 位运算题目:两数相除
  • 测试基础笔记第十五天
  • AI日报 - 2025年04月29日
  • esm使用-包括esmfold和embedding
  • 王毅:携手做世界和平与发展事业的中流砥柱
  • 法治日报调查直播间“杀熟”乱象:熟客越买越贵,举证难维权不易
  • 人民日报评论员:汇聚起工人阶级和广大劳动群众的磅礴力量
  • ​关键词看中国经济“一季报”:韧,长期向好看底气
  • 中方会否公布铁线礁的领海基线?外交部:中方执法活动旨在反制菲方侵权挑衅
  • 杭州打造商业航天全产业链,请看《浪尖周报》第22期