刷题日记5

news/2025/2/26 8:47:57

2025.2.17

1358. 包含所有三种字符的子字符串数目

1358. 包含所有三种字符的子字符串数目

class Solution {
public:
    int numberOfSubstrings(string s) {
        int l=0,r=0,res=0;
        vector<int>num(3,0);
        while(r<s.size()){
            int tmp=s[r]-'a';
            num[tmp]++;
            while(num[0]&&num[1]&&num[2]){
                tmp=s[l]-'a';
                num[tmp]--;
                l++;
            }
            res+=l;
            r++;
        }
        return res;
    }
};

思考:1.题目是求目标子数组,长度是越长越好,那么规律就是找到每一个符合条件的最短子数组,res+=1+l-1=l;因为最短的符合条件的子数组,再在他的左边加数,也还是符合。

2.双指针构成滑动窗口,右指针遍历整个数组,当a,b,c都出现时,左指针右移,缩小窗口。那么什么时候统计满足条件的子数组个数?右指针每次右移时,更新res+=l;

2962. 统计最大元素出现至少 K 次的子数组

2962. 统计最大元素出现至少 K 次的子数组

class Solution {
public:
    long long countSubarrays(vector<int>& nums, int k) {
        int l=0,r=0,max=0;
        int cnt=0;
        long long res=0;
        for(int i=0;i<nums.size();i++){
            if(nums[i]>max)max=nums[i]; 
        }
        while(r<nums.size()){
            if(nums[r]==max)cnt++;
           while(cnt>=k){
            if(nums[l]==max)cnt--;
            l++;
           }
           res+=l;
           r++;
        }
        return res;
    }
};

思考:和上一题一样。

2025.2.18

3325. 字符至少出现 K 次的子字符串 I

3325. 字符至少出现 K 次的子字符串 I

class Solution {
public:
    int numberOfSubstrings(string s, int k) {
        int l=0,r=0,res=0;
        vector<int>num(26,0);
        while(r<s.size()){
            num[s[r]-'a']++;//右指针遍历,
            //右指针对应的字符出现的次数>=k时,缩短窗口
            while(num[s[r]-'a']>=k){
                num[s[l]-'a']--;
                l++;
            }
            res+=l;
            r++;
        }
        return res;
    }
};

思考:1.右指针遍历,并且每次累加指针对应字符的出现次数。

2.右指针每次遍历时,累加完出现次数,还判断次数是否超过k。如果超过 就缩小窗口大小。

3.res=+l。右指针每次右移一次都执行res+=l;

2799. 统计完全子数组的数目

2799. 统计完全子数组的数目

class Solution {
public:
    int countCompleteSubarrays(vector<int>& nums) {
        unordered_map<int,int>m;
        for(int i=0;i<nums.size();i++){
            m[nums[i]]++;
        }
        int k=m.size();
        unordered_map<int,int>map;
        int l=0,r=0,res=0;
        while(r<nums.size()){
            map[nums[r]]++;
            while(map.size()==k){
                if(!--map[nums[l]])map.erase(nums[l]);
                l++;
            }
            res+=l;
            r++;
        }
        return res;
    }
};

思路:思想都一样,res+=l;这其中不同的区别就是二层循环的判断条件。

2537. 统计好子数组的数目

2537. 统计好子数组的数目

class Solution {
public:
    long long countGood(vector<int>& nums, int k) {
        int l=0,r=0,cnt=0;
        long long res=0;
        unordered_map<int,int>map;
        while(r<nums.size()){
            cnt+=map[nums[r]]++;
            while(cnt>=k){
                cnt-=--map[nums[l]];
                l++;
            }
            res+=l;
            r++;
        }
        return res;
    }
};

思考:1.卡壳的地方是:如何统计右移后数字对的对数。二层循环中的条件如何设置。

2.模拟一下就知道了。从0到1,cnt+=0。从1到2,cnt+=1。从2到3,cnt+=2。

同理:从3到2,cnt-=2.从2到1,cnt-=1。从1到0,cnt-=0。

2025.2.19

713. 乘积小于 K 的子数组

713. 乘积小于 K 的子数组

class Solution {
public:
    int numSubarrayProductLessThanK(vector<int>& nums, int k) {
        int l=0,r=0,res=0,cnt=1;
        while(r<nums.size()){
            cnt*=nums[r];
            while(cnt>=k&&l<=r){
                cnt=cnt/nums[l];
                l++;
            }
            res+=r-l+1;
            r++;
        }
        return res;
    }
};

思考:1.数组越短越好,res+=r-l+1

2.注意二层循环可能因为cnt一直>=k,一直循环下去,导致数组越界。需要加上l<=r、

3258. 统计满足 K 约束的子字符串数量 I

3258. 统计满足 K 约束的子字符串数量 I

class Solution {
public:
    int countKConstraintSubstrings(string s, int k) {
        int l=0,r=0,res=0;
        vector<int>num(2,0);
        while(r<s.size()){
            num[s[r]-'0']++;
            while(num[0]>k&&num[1]>k){
                num[s[l]-'0']--;
                l++;
            }
            res+=r-l+1;
            r++;
        }
        return res;
    }
};

2302. 统计得分小于 K 的子数组数目

2302. 统计得分小于 K 的子数组数目

class Solution {
public:
    long long countSubarrays(vector<int>& nums, long long k) {
        int l=0,r=0;
        long long res=0,cnt=0;;
        while(r<nums.size()){
            cnt+=nums[r];
            while(cnt*(r-l+1)>=k){
                cnt-=nums[l];
                l++;
            }
            res+=r-l+1;
            r++;
        }
        return res;
    }
};

思考:公式真好用,直接秒。


http://www.niftyadmin.cn/n/5868416.html

相关文章

在自己的数据上复现一下LlamaGen

git仓库&#xff1a;https://github.com/FoundationVision/LlamaGen 数据集准备 如果用ImageFolder读取&#xff0c;则最好和ImageNet一致。 data_path/class_1/image_001.jpgimage_002.jpg...class_2/image_003.jpgimage_004.jpg......class_n/image_005.jpgimage_006.jpg.…

web安全——web应用程序技术

文章目录 一、HTTP1.1 HTTP方法1.2 HTTP消息头1.3 cookie1.4 状态码 二、web功能2.1 服务器端功能2.2 客户端功能——同源策略 三、编码方案3.1 URL编码3.2 Unicode编码3.3 HTML编码3.4 Base64编码 一、HTTP HTTP&#xff08;超文本传输协议&#xff09;是web应用程序使用的通…

【CSS 选择器的特异度 CSS 继承 CSS 求值过程解析 CSS 布局方式及相关技术】

以下是关于 CSS 选择器特异度、继承、求值过程及布局技术 的详细解析&#xff0c;结合核心概念和实际应用场景&#xff1a; 一、CSS 选择器特异度&#xff08;Specificity&#xff09; 1. 特异度规则 特异度用于决定当多个选择器作用于同一元素时&#xff0c;哪个样式优先级更…

布署elfk-准备工作

建议申请5台机器部署elfk&#xff1a; filebeat(每台app)--> logstash(2台keepalived)--> elasticsearch(3台)--> kibana(部署es上)采集输出 处理转发 分布式存储 展示 ELK中文社区: 搜索客&#xff0c;搜索人自己的社区 官方…

当AI搜索撕开传统搜索的裂缝,警惕AI搜索的“信息茧房”

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 人工智能&AIGC术语100条 Shelly聊AI-重…

鸿蒙NEXT开发-用户通知服务

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 目录 1. 用户通知服务基本介绍 2. 能力范围 …

笔记20250225

关于上拉电阻和下拉电阻的作用 原理 上拉电阻&#xff1a;在上拉电阻所连接的导线上&#xff0c;如果外部组件未启用&#xff0c;上拉电阻则“微弱地”将输入电压信号“拉高”。当外部组件未连接时&#xff0c;对输入端来说&#xff0c;外部“看上去”就是高阻抗的&#xff0c…

【初阶数据结构】链表的柔光之美

目录 一、为什么需要链表&#xff1f; 二、链表与数组的对比 三、链表节点定义 四、链表基本操作 1. 创建链表 2. 插入节点 头插法&#xff08;时间复杂度O(1)&#xff09; 尾插法&#xff08;时间复杂度O(n)&#xff09; 3. 删除节点 4. 遍历链表 五、进阶操作 1. 反…