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

leetcode(hot100)10、11、12

解题思路:前缀和与哈希表  因为本题数组的值不是全部都是正整数,所以不能用滑动窗口 

这道题哈希表所采用的思想和两数之和用相同的方法 前缀和就相当于两数之和的和 然后从哈希表中去寻找sum-k的值 找到的值就是结果,首先将哈希表的键置0值置为1因为如果sum-k刚好等于0那这个时候怎么办

class Solution {
public:
//前缀和加上哈希表
    int subarraySum(vector<int>& nums, int k) {
        int sum = 0, result = 0;
        unordered_map<int,int>map{{0,1}};
        for(int i = 0;i<nums.size();i++){
            sum += nums[i];
            if(map.find(sum-k) != map.end()){
                result += map[sum-k];
            }
            map[sum]++;
        }
        return result;
    }
};

解题思路:使用一个双端队列deque

首先想一想滑动窗口的大概思路,然后按照滑动窗口的框架来写 dp中主要存储的是下标,保持队列单调递减,当加入的值小于dp中的值时用pop_back,

当dp中的下标窗口超了就pop_front(), 当窗口达到k记录最大值。

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        int left = 0;
        vector<int>result;
        deque<int>dp;//dp存储的是下标
        for(int right = 0;right < nums.size();right++){
            if(!dp.empty() && dp.front() == right-k){//移除超出窗口的元素
                dp.pop_front();
            }
            while(!dp.empty() && nums[dp.back()] < nums[right]){//保持队列单调递减
                dp.pop_back();
            }
            dp.push_back(right);
            
            if(right >= k-1){//当窗口达到k时记录最大值
                result.push_back(nums[dp.front()]);
            }
        }
        return result;
    }
};

解题思路:滑动窗口  

右指针遍历整个字符串 s 如果当前字符的频率满足 t 中的频率,增加 valid 

当 valid == cont.size() 时,窗口包含了 t 中所有的字符,开始尝试收缩窗口

更新最小窗口长度和起始位置 收缩窗口,移动左指针 如果某个字符的频率不再满足 t 中的要求,减少 valid

class Solution {
public:
    string minWindow(string s, string t) {
        unordered_map<char, int> conts;  // 当前窗口的字符频率
        unordered_map<char, int> cont;   // t 中字符的频率

        // 记录 t 中每个字符的频率
        for (char c : t) {
            cont[c]++;
        }

        int left = 0, valid = 0, start = 0, minlen = INT_MAX;
        
        // 右指针遍历整个字符串 s
        for (int right = 0; right < s.size(); right++) {
            // 如果 s[right] 在 t 中
            if (cont.count(s[right])) {
                conts[s[right]]++;
                // 如果当前字符的频率满足 t 中的频率,增加 valid
                if (conts[s[right]] == cont[s[right]]) {
                    valid++;
                }
            }

            // 当 valid == cont.size() 时,窗口包含了 t 中所有的字符,开始尝试收缩窗口
            while (valid == cont.size()) {
                // 更新最小窗口长度和起始位置
                if (right - left + 1 < minlen) {
                    minlen = right - left + 1;
                    start = left;
                }

                // 收缩窗口,移动左指针
                if (cont.count(s[left])) {
                    conts[s[left]]--;
                    // 如果某个字符的频率不再满足 t 中的要求,减少 valid
                    if (conts[s[left]] < cont[s[left]]) {
                        valid--;
                    }
                }
                left++;  // 左指针右移,收缩窗口
            }
        }

        // 如果找到了符合条件的最小窗口,则返回,否则返回空字符串
        return minlen == INT_MAX ? "" : s.substr(start, minlen);
    }
};


http://www.kler.cn/a/502052.html

相关文章:

  • 特制一个自己的UI库,只用CSS、图标、emoji图 第二版
  • Elasticsearch入门学习
  • 每日一题(三):压缩字符串(行程长度编码)
  • Termora 一个开源的 SSH 跨平台客户端工具
  • 对话新晋 Apache SeaTunnel Committer:张圣航的开源之路与技术洞察
  • 稀疏编码 (Sparse Coding) 算法详解与PyTorch实现
  • 【HTML+CSS+JS+VUE】web前端教程-29-清除浮动
  • Spring Data Elasticsearch简介
  • 鸿蒙UI开发——颜色选择器
  • 【Ubuntu与Linux操作系统:七、系统高级管理】
  • 【论文速读】| 利用大语言模型在灰盒模糊测试中生成初始种子
  • Django Admin 中为自定义操作添加权限控制
  • Folder Icons v2.0.2 文件/文件夹图标美化 支持M、Intel芯片
  • 【南京工业大学主办 | JPCS独立出版 | 高届数、会议历史好 | 投稿领域广泛】第八届智能制造与自动化国际学术会议(IMA 2025)
  • Rank-Analysis——LOL 排位战绩查询分析器
  • 【LeetCode: 763. 划分字母区间 + 贪心】
  • Bash语言的语法糖
  • 对React中类组件和函数组件的理解?有什么区别?
  • ansible 检查目录大小
  • 【C++】size_t究竟是什么?全面解析与深入拓展
  • CSS3的aria-hidden学习
  • 每日一题(三):压缩字符串(行程长度编码)
  • vue城市道路交通流量预测可视化系统
  • 《变形金刚-游戏》V1.0官方学习版
  • Redis 为什么要引入 Pipeline机制?
  • C++中锁和互斥量的原理、区别和使用建议