力扣hot100【子串专题】

560.和为k的子数组

最常见的想法肯定是枚举,枚举每个以某一个字符为起点的子数组,统计个数。优化的话可以考虑前缀和+哈希,用一个哈希表记录从i=0开始到前缀和为sj-k的个数,将每次统计的累积到ans上。

c++ 复制代码
class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int n=nums.size();
        vector<int>s(n+1);
        for(int i=0;i<n;i++){
            s[i+1]=s[i]+nums[i];
        }
        int ans=0;
        unordered_map<int,int>cnt;
        for(int sj:s){
            ans+=cnt.contains(sj-k)?cnt[sj-k]:0;
            cnt[sj]++;
        }
        return ans;
    }
};

239.滑动窗口最大值

我们发现,每次新要加入定长区间的元素,他只会影响比它小的元素,也就是说,所有比它小的元素在之后都不可能成为这个区间的最大值。所以我们用到一个单调递减的双端队列(单调队列),队头是该区间的最大值。首先要将前k个元素入队,按照单调递减的顺序。之后的元素一样按照此逻辑进行入队,不过当队头元素的下表不在区间范围内了,要进行出队。

c++ 复制代码
class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        deque<int>q;
        int n=nums.size();
        vector<int>ans;
        for(int i=0;i<k;++i){
            while(!q.empty()&&nums[i]>=nums[q.back()]){
                q.pop_back();
            }
            q.push_back(i);
        }
        ans.push_back(nums[q.front()]);
        for(int i=k;i<n;++i){
            while(!q.empty()&&nums[i]>=nums[q.back()]){
                q.pop_back();
            }
            q.push_back(i);
            while(q.front()<=i-k){
                q.pop_front();
            }
            ans.push_back(nums[q.front()]);
        }
        return ans;
    }
};

76.最小覆盖子串

该题考到了滑动窗口,只需要不断维护满足条件的最短窗口即可,最后返回该长度的子串。

c++ 复制代码
class Solution {
public:
    int cnt[256];
    string minWindow(string s, string t) {
        int m=s.size(),n=t.size();
        if(m<n)return "";
        map<char,int>mp;
        int nums=0;
        for(auto &it :t){
            if(mp.count(it)==0){
                nums++;
            }
            mp[it]++;
        }
        int start=0,min_len=m+1;
        for(int i=0,j=0;j<m;j++){
            cnt[s[j]]++;
            if(cnt[s[j]]==mp[s[j]]){
                nums--;
            }
            while(cnt[s[i]]>mp[s[i]]){
                cnt[s[i]]--;
                i++;
            }
            if(nums==0&&j-i+1<min_len){
                start=i;
                min_len=j-i+1;
            }
        }
        if(min_len==m+1)return "";
        return s.substr(start,min_len);
    }
};
相关推荐
Zootopia62616 小时前
美国载人飞船Crew-13明晚发射!
人工智能·算法·机器学习·数学建模·无人机·创业创新·信息与通信
zhangfeng113317 小时前
qjlDim 含义 TurboQuant QJL Quantized Johnson-Lindenstrauss,量化JL随机投影
人工智能·算法·ai编程·npu
HwJack2017 小时前
【HarmonyOS开发小实践】HarmonyOS GC 引用计数 vs 对象追踪,三种回收算法
jvm·算法·harmonyos
blxr_17 小时前
力扣hot100前k个高频元素https://leetcode.cn/problems/top-k-frequent-elements/
算法·leetcode·职场和发展
longlongzihan1 天前
LeetCode 17电话号码的字母组合:回溯算法(DFS)详解
c++·算法·leetcode·深度优先
封印师请假去地球钓鱼1 天前
边解边变的问题:从“决策依赖“一词出发
人工智能·算法
今晚打老虎1 天前
c++之提高A(前缀和)(第三课)
数据结构·c++·算法
财情双生教练易和中1 天前
“找矿大会战”产业链,量化统计研究报告
职场和发展·职业发展·创业创新·程序员创富
不会就选b1 天前
算法日常・每日刷题--<贪心>26
数据结构·算法
yuanxi2001 天前
001267拟扩产光模块:大客户销售如何用价值力读一条扩产公告
人工智能·职场和发展·创业创新·学习方法