首页 > 其他分享 >lc992 K个不同整数的子数组

lc992 K个不同整数的子数组

时间:2024-03-22 22:56:30浏览次数:23  
标签:lc992 cnt nums int get 个数 整数 数组

给定正整数数组nums[n]和一个整数k,返回nums中好子数组的数目。如果nums的某个连续子数组中不同的整数个数恰好为k,则称其为好数组。
1<=n<=2e4; 1<=nums[i],k<=n

先将问题做下转化:恰好为k的个数 = 最多为k的个数 - 最多为k-1的个数。而最多为k的个数可以用双指针来解决,固定L并不断往右延升R,每次得到可行的R时,计算[L,R]内以R为终点的区间个数,并累加到答案。

class Solution {
public:
    int subarraysWithKDistinct(vector<int>& nums, int k) {
        auto get = [&](int d) {
            if (d <= 0) return 0;
            int ans = 0;
            int n = nums.size();
            map<int,int> cnt;
            int L, R;
            for (L = 0, R = 0; R < n; R++) {
                if (cnt.size() < d || cnt.count(nums[R])) {
                    cnt[nums[R]] += 1;
                    ans += R - L + 1;
                } else {
                    if (--cnt[nums[L]] == 0) {
                        cnt.erase(nums[L]);
                    }
                    L += 1;
                    R -= 1;
                }
            }
            return ans;
        };
        return get(k) - get(k-1);
    }
};

标签:lc992,cnt,nums,int,get,个数,整数,数组
From: https://www.cnblogs.com/chenfy27/p/18090555

相关文章

  • 【LeetCode-153.寻找旋转排序数组的最小值】
    已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums=[0,1,2,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]注意,数组 [a[0],a[1],a[2],...,a[n-1......
  • 整数和浮点数在内存中的存储
    整数和浮点数在内存中的存储整数在内存中的存储浮点数在内存中的存储整数在内存中的存储1.整数是以二进制的形式存储的,一个二进制位会占据一个比特位的空间。例如:#include<stdio.h>intmain(){ inta=10;//十进制的形式 //1010二进制形式 //一个整型是四......
  • 添加区间到集合中,并计算出现在至少一个区间中的整数个数
    Leetcode题目:不断地添加区间到区间集合中,并计算出现在至少一个区间中的整数个数。使用BTreemap动态开区间。usestd::collections::BTreeMap;structCountIntervals{mp:BTreeMap<i32,i32>,cnt:i32,}implCountIntervals{fnnew()->Self{C......
  • 2605. 从两个数字数组里生成最小数字c
    intminNumber(int*nums1,intnums1Size,int*nums2,intnums2Size){intmin=INT_MAX;for(inti=0;i<nums1Size;i++){intsum=0;for(intj=0;j<nums2Size;j++){if(nums1[i]!=nums2[j]){if(nums1[i]>......
  • LeetCodeHot100 二分查找 35. 搜索插入位置 74. 搜索二维矩阵 34. 在排序数组中查
    35.搜索插入位置https://leetcode.cn/problems/search-insert-position/description/?envType=study-plan-v2&envId=top-100-likedpublicintsearchInsert(int[]nums,inttarget){intleft=0;intright=nums.length-1;while(left<......
  • (41/60)0-1背包(二维数组、一维数组)、分割等和子集
    有点抽象0-1背包卡码网:携带研究材料(第六期模拟笔试)动态规划思路二维:意义:0~i物品内,放进容量为j的背包,最大价值为dp[i][j]递推:dp[i][j]=max(dp[i-1][j-weight[i],dp[i-1][j])初始化:第一列为0,第一行j>=weight[0]时赋值为value[0]遍历:先背包再物品/先物品再背包均可(......
  • C语言实现反转整数
    题目描述:从标准输入流(控制台)中获取一个整数 num,将其 按位反转 后通过输出语句输出反转后的整数,保留原来整数的正负性。思路:前提是num不等于0首先我们需要定义一个中间变量 temp 来存放当前 num 的最小位,获取最小位存在temp---temp=num%10通过 result=result*1......
  • 循环控制:(第10题)与闰年相关的问题,涉及数组,函数的知识
    #include<stdio.h>intis_leap_year(intyear){ if((year%4==0&&year%100!=0)||year%400==0) return1; else return0;}intgap_years(intyear){ inti=1990; intsum=0; intgap_years=0; if(year==1990) retur......
  • 非有序数组也能二分? —— 红蓝染色法续篇(Leetcode 162.寻找峰值)
    1.写在前面本文为个人学习总结,参考:B站Up:灵茶山艾府参考视频链接:https://www.bilibili.com/video/BV1QK411d76w/2.题目我们来看一下下面这道题:峰值元素是指其值严格大于左右相邻值的元素。给你一个整数数组nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在......
  • C语言——保留整数
    题目描述:输入一个字符串str1,把其中的连续非数字的字符子串换成一个,存入字符数组str2中,所有数字字符也必须依次存入str2中,输出str2。输入:输入为一行字符串str1​,其中可能包含空格。字符串长度不超过80个字符。$Ts!47&*s456a23*+B9k输出:输出处理好的字符串str2。*47*......