当前位置: 首页 > 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;}
};

http://www.xdnf.cn/news/199189.html

相关文章:

  • [Spring] Sentinel详解
  • Linux常见基础命令
  • i/o复用函数的使用——epoll
  • jclasslib 与 BinEd 结合的二进制分析技术指南
  • 【计算机系统结构】第四章
  • 利用EMQX实现单片机和PyQt的数据MQTT互联
  • 数据库系统概论|第三章:关系数据库标准语言SQL—课程笔记6
  • 计算机基础—(九道题)
  • 云上玩转DeepSeek系列之六:DeepSeek云端加速版发布,具备超高推理性能
  • AI图片跳舞生成视频,animate X本地部署。
  • 2025系统架构师---论企业集成平台的技术与应用
  • 永磁同步电机控制算法-反馈线性化滑模控制
  • Telephony VoiceMail
  • 数据库基础与核心操作:从概念到实战的全面解析
  • 嵌入式多功能浏览器系统设计详解
  • 使用双端队列deque模拟栈stack
  • 获得ecovadis徽章资格标准是什么?ecovadis评估失败的风险
  • sortablejs + antd-menu 拖拽出重复菜单
  • 【个人理解】MCP server和client二者各自的角色以及发挥的作用
  • 【TS入门笔记4---装饰器】
  • DPanel 一款更适合国人的 Docker 管理工具
  • linux 使用nginx部署vue、react项目
  • 结合大语言模型的机械臂抓取操作学习
  • Python 中支持函数式编程的 operator 与 functools 包
  • 第一节:Linux系统简介
  • Android显示学习笔记本
  • 打造即插即用的企业级云原生平台——KubeSphere 4.1 扩展组件在生产环境的价值全解
  • 解决跨域实现方案
  • 用vite动态导入vue的路由配置
  • 本地部署Qwen-7B实战 vLLM加速推理