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

LeetCode 每日一题 2799. 统计完全子数组的数目

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 代表子数组结尾,左边界 l 代表子数组开头

r 不断右移,当子数组满足条件时,l 开始右移,直到第一次不满足条件,那么以 l 左边所有数字为开头的子数组都是合法的,即有 l 个完全子数组,res+=l,之后 r 接着右移,即使右移之后窗口内的子数组仍然不满足条件,只是 l 不动而已,还是有 l 个满足条件的子数组,res+=l

r 不断右移,即枚举出所有子数组的结尾,遍历完数组就是所有的完全子数组


代码如下↓

class Solution {
public:int countCompleteSubarrays(vector<int>& nums) {set<int> s;unordered_map<int,int> arr;for(int i:nums){s.insert(i);}int n=s.size();int sum=0;int l=0;int r=n-1;for(int i=0;i<=r;i++){if(arr[nums[i]]++==0){sum++;}}long long res=0;while(r<nums.size()){while(sum==n){if(--arr[nums[l]]==0){sum--;}l++;}res+=l;r++;if(r>=nums.size()){break;}if(arr[nums[r]]++==0){sum++;}}return res;}
};

相关文章:

  • 系统架构-安全架构设计
  • 银行卡归属地查询的快速入门:API接口性能与安全兼备的高效实现
  • 融合注意力机制和BiGRU的电力领域发电量预测项目研究,并给出相关代码
  • Servlet小结
  • Oracle_开启归档日志和重做日志
  • 使用 SSE + WebFlux 推送日志信息到前端
  • C++开发未来发展与就业前景:从底层基石到未来引擎
  • NLP高频面试题(五十四)——深度学习归一化详解
  • uniapp开发3--前端显示对象数据的方法总结
  • 数图信息科技邀您共赴第二十五届中国零售业博览会
  • 跨Linux发行版CPU指令集兼容性深度解析与实践指南
  • C++初登门槛
  • AWX配置持久化 Playbook 目录
  • WebUI可视化:第4章:Streamlit数据可视化实战
  • Git基本使用(很详细)
  • OceanBase 复合索引指南
  • 计算机组成原理 课后练习
  • 蓝桥杯 3. 密码脱落
  • 深度学习--循环神经网络RNN
  • 线程怎么创建?Java 四种方式一网打尽
  • 持续更新丨伊朗官员:港口爆炸已致5人死亡超700人受伤
  • 识味顺德︱顺德菜的醉系列与火滋味
  • 强政神鸟——故宫里的乌鸦
  • 商务部就海外社交平台上发布从所谓中国“代工厂”低价购买国际知名品牌事答问
  • 释新闻|印度宣布“掐断”巴基斯坦水源,对两国意味着什么?
  • 消费补贴政策力度最大的一届!第六届上海“五五购物节” 4月底启幕