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

【Leetcode 每日一题】2799. 统计完全子数组的数目

问题背景

给你一个由 整数组成的数组 n u m s nums nums
如果数组中的某个子数组满足下述条件,则称之为 完全子数组

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

返回数组中 完全子数组 的数目。
子数组 是数组中的一个连续非空序列。

数据约束

  • 1 ≤ n u m s . l e n g t h ≤ 1000 1 \le nums.length \le 1000 1nums.length1000
  • 1 ≤ n u m s [ i ] ≤ 2000 1 \le nums[i] \le 2000 1nums[i]2000

解题过程

子数组越长,包含的元素种类越多,越有可能符合条件,满足单调性的要求,可以滑窗。
累计答案的时候需要注意,整个数组中元素的数目不会小于子数组中元素的数目。
出现某个范围内的元素已经包含了所有种类,这时候扩展端点得到的所有子数组都是符合条件的。
其中,如果在内层循环中进行统计,那么右端点可以选择从当前位置到数组末尾的所有所有位置;如果在内层循环结束时进行统计,那么左端点可以选择从零位置开始到当前位置之前的所有位置。

具体实现

class Solution {public int countCompleteSubarrays(int[] nums) {int[] count = new int[2010];Set<Integer> set = new HashSet<>();for (int num : nums) {set.add(num);}int diff = set.size();int res = 0;int n = nums.length;for (int left = 0, right = 0; right < n; right++) {if (count[nums[right]]++ == 0) {diff--;}while (diff == 0) {if(--count[nums[left++]] == 0) {diff++;}// 在内层循环中统计答案,固定左端点得到的所有子数组都是符合条件的res += n - right;}// 在内层循环结束时统计答案,固定右端点得到的所有子数组都是符合条件的// res += left;}return res;}
}

相关文章:

  • Nginx 中间件
  • 【一次成功!】Ubuntu22.04 安装 Autoware、 cuda、 cudnn、 TensorRT
  • PostgreSQL 分区表——范围分区SQL实践
  • Web3.0的认知补充(去中心化)
  • 从Kafka读取数据
  • “广州丰田汽车.网址”中文域名仲裁案:“网络门牌”保护战
  • Nginx 通过 Let‘s Encrypt 实现 HTTPS 访问全流程指南
  • 大模型是如何生成内容的?
  • Linux基础使用-笔记
  • 第三篇:Django创建表关系及生命周期流程图
  • Macbook M系列Arm设置任何来源安装第三方软件,安装Notepad--
  • 点云配准算法之NDT算法原理详解
  • 【信息系统项目管理师】高分论文:论进度管理和成本管理(智慧城管平台项目)
  • 树莓派的系统烧录
  • 私钥连接服务器(已经有服务器私钥
  • 【前端】ES6 引入的异步编程解决方案Promise 详解
  • 删除排序数组中的重复项--LeetCode
  • 基于Matlab的车牌识别系统
  • 2025年3月电子学会青少年机器人技术(六级)等级考试试卷-理论综合
  • wait_event 类接口详解
  • 具身智能资本盛宴:3个月37笔融资,北上深争锋BAT下场,人形机器人最火
  • 国家开发银行原副行长李吉平一审获刑14年
  • 北京媒体锐评男子地铁辱骂他人:北京地铁永远欢迎沾着泥巴的普通劳动者
  • 李家超:香港特区政府积极推进十五运会各项筹办工作
  • 青创上海—2025浦东徒步行活动举行,“青年草坪创新创业湃对”正式亮相
  • 成了“一日顶流”又能如何?