首页 > 其他分享 >力扣---6900. 统计完全子数组的数目

力扣---6900. 统计完全子数组的数目

时间:2023-07-30 15:11:06浏览次数:36  
标签:力扣 right map int nums --- 数组 6900 left

给你一个由  整数组成的数组 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

 

周赛第二题。

可以想到,当一个子数组包含所有数字后,包含该子数组的所有数组都符合题意,且此数量分为三种:1. 以该数组左边界为边界。2. 以该数组右边界为边界。3. 该数组左右边界都不是边界。

固定一遍,向右遍历。可以发现,当固定左边界后,第三种情况一定会在之前的遍历就包含。而第二种情况,则是当前情况的答案数量。

滑动窗口。

class Solution {
//    滑动窗口。
//    维护窗口中的数据总是符合题意。
//    可以想到,以当前窗口左边界开始,以当前窗口为子窗口的字数组,共有 len - right 个(len指数组长度,right 指窗口右边界。)
    public int countCompleteSubarrays(int[] nums) {
        Set<Integer> set = new HashSet<>();
        for (int x : nums) {
            set.add(x);
        }
        int left = 0;
        int right = 0;
        int res = 0;
        int n = set.size();
        Map<Integer, Integer> map = new HashMap<>();
        while (right < nums.length) {
            if (map.size() < n) {
                map.put(nums[right], map.getOrDefault(nums[right], 0) + 1);
                right++;
                if (map.size() < n) {
                    continue;
                }
            }
            while (map.size() == n) {
                res += nums.length - right + 1;
                if (map.get(nums[left]) == 1) {
                    map.remove(nums[left]);
                } else {
                    map.put(nums[left], map.get(nums[left]) - 1);
                }
                left++;
            }

        }
        return res;
    }
}

 

标签:力扣,right,map,int,nums,---,数组,6900,left
From: https://www.cnblogs.com/allWu/p/17591475.html

相关文章

  • Rockchip RK3399 - Machine驱动(simple-card)
     ----------------------------------------------------------------------------------------------------------------------------开发板:NanoPC-T4开发板eMMC:16GBLPDDR3:4GB显示屏:15.6英寸HDMI接口显示屏u-boot:2023.04linux  :6.3------------------------......
  • Rockchip RK3399 - Codec驱动( Realtek ALC5651)
    ----------------------------------------------------------------------------------------------------------------------------开发板:NanoPC-T4开发板eMMC:16GBLPDDR3:4GB显示屏:15.6英寸HDMI接口显示屏u-boot:2023.04linux :6.3----------------------------......
  • Rockchip RK3399 - Platform驱动(DMA&i2s0)
    Platfromdriver提供了配置/使能SoC音频接口的能力;Plaftrom驱动分为两个部分:snd_soc_platform_driver、snd_soc_dai_driver。snd_soc_platform_driver:负责管理音频数据,把音频数据通过DMA或其他操作传送至CPUDAI中;snd_soc_dai_driver:负责完成SoC一侧的DAI参数配置,同时也会通过......
  • python数据分析师入门-学习笔记(第八节 python爬虫的准备工作)
    学习链接:Python数据分析师入门python爬虫的准备工作一台电脑尽量windows电脑语言环境编程语言爬虫并不是python独有Python开发环境Anaconda了解爬虫的实现和原理用代码去控制终端用代码直接发送请求CS(客户端服务器)/BS(浏览器服务器)模型CS/BS浏览......
  • 2023-7-28、29 文件监控和ssrf
    27晚上+28、29写了个文件监控的脚本,目前除了基本的监控只有自动删除新增文件和自动恢复被删文件的功能这点ssrf是28号的,先发了,要不不知道要拖到啥时候,等明天把脚本和剩下的发了ssrf 进去之后是这样的 让我们访问flag.php 只能来自127.0.0.1伪协议  直接读试试......
  • 无涯教程-jQuery - Tabs组件函数
    窗口小部件选项卡函数可与JqueryUI中的窗口小部件一起使用。选项卡用于在分成逻辑部分的内容之间交换。Tabs-语法$("#tabs").tabs();Tabs-示例以下是显示Tab用法的简单示例-<!doctypehtml><htmllang="en"><head><metacharset="utf-8"><title>......
  • linux命令-tar 打包压缩命令
    tar命令用于文件的打包或压缩,是最为常用的打包压缩命令,其语法格式如下:tar[选项]文件名.tar.gz源文件常用指令:tar-czvfxxx.tar.gz source_file(tar-czvf包名.tar.gz 源文件)    #以tar.gz方式打包并gz方式压缩tar-xzvfxxx.tar.gz-Cpath(tar-xzvfx......
  • 408-数据结构算法题笔记
    常用基本操作1.定义整数无穷大#defineINT_MAX=0x7f7f7f7f;2.绝对值函数intabs_(intx){ if(x<0)return-x; returnx;}3.最大最小值函数(一般可以直接写吧)intmin(inta,intb){ if(a<b)returna; returnb;}说明时空间复杂度可以先设neg:代码规范1.函......
  • 力扣-前k个高频元素
    1.问题描述给定一个非空的整数数组,返回其中出现频率前k高的元素。示例1:输入:nums=[1,1,1,2,2,3],k=2输出:[1,2]示例2:输入:nums=[1],k=1输出:[1] 说明:你可以假设给定的k总是合理的,且1≤k≤数组中不相同的元素的个数。你的算法的时间复杂度......
  • 无涯教程-jQuery - Spinner组件函数
    WidgetSpinner函数可与JqueryUI中的窗口小部件一起使用。Spinner提供了一种从一组中选择一个值的快速方法。Spinner-语法$("#menu").selectmenu();Spinner-示例以下是显示Spinner用法的简单示例-<!doctypehtml><htmllang="en"><head><metacharset="......