当前位置: 首页 > 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 类接口详解
  • “五一”假期逛上海车展请提前购票,展会现场不售当日票
  • 中吉乌铁路重点控制性工程开工建设,包括三座隧道
  • 运动健康|不同能力跑者,跑步前后营养补给差别这么大?
  • 农行一季度净利润719亿元增2.2%,不良率微降至1.28%
  • “杭州六小龙”的招聘迷局
  • 普京发表声明感谢协助俄军收复库尔斯克州的朝鲜军人