LeetCode热题100刷题4:76. 最小覆盖子串、239. 滑动窗口最大值、53. 最大子数组和、56. 合并区间

76. 最小覆盖子串

滑动窗口解决字串问题。

labuladong的算法小抄中关于滑动窗口的算法总结:

cpp 复制代码
class Solution {
public:
    string minWindow(string s, string t) {
        unordered_map<char,int> need,window;

        for(char c : t) {
            need[c]++;
        }

        int left = 0, right = 0;
        int start = 0, len = INT_MAX;
        int valid=0;
        while(right < s.size()) {
            char c = s[right];
            right++;
            if(need.count(c)) {
                window[c]++;
                if(window[c] == need[c])
                    valid++;
            }

            while(valid==need.size()) {
                if(right-left < len) {
                    start = left;
                    len = right-left;
                }

                char d = s[left];
                left++;
                if(need.count(d)) {
                    if(window[d]==need[d])
                        valid--;
                    window[d]--;
                }
            }
        }
        return len==INT_MAX ? "" : s.substr(start,len);
    }
};

239. 滑动窗口最大值

加粗样式

cpp 复制代码
class Solution {
public:
    class MyQueue{
        public:
            deque<int> que;

            void pop(int value) {
                if(!que.empty() && value==que.front()) {
                    que.pop_front();
                }
            }
            void push(int value) {
                while(!que.empty() && value > que.back()) {
                    que.pop_back();
                }
                que.push_back(value);
            }
            int front(){
                return que.front();
            }

    };
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        MyQueue que;
        vector<int> result;
        for(int i=0;i<k;i++) {
            que.push(nums[i]);
        }
        result.push_back(que.front());
        for(int i=k;i<nums.size();i++) {
            que.pop(nums[i-k]);
            que.push(nums[i]);
            result.push_back(que.front());
        }
        return result;
    }
};

53. 最大子数组和

贪心做法:寻找局部最优的逻辑

cpp 复制代码
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        if(nums.size()<=1)
            return nums[0];
        int sum = nums[0];
        int res = sum;
        for(int i=1;i<nums.size();i++) {
            sum = max(nums[i]+sum , nums[i]);
            if(sum > res)
                res = sum;
        }
        return res;
    }
};

56. 合并区间

按代码随想录来说的话,划分为贪心算法找局部最优的一类问题
今天刚复习了STL的vector底层原理,这个back()是已经实现好的函数,能够获取得数组未元素(的引用)

cpp 复制代码
class Solution {
public:
    static bool cmp(vector<int>& a, vector<int>& b) {
        if(a[0]==b[0])
            return a[1]<b[1];
        else
            return a[0] < b[0];
    }
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        if(intervals.size() <=1)
            return intervals;
        sort(intervals.begin(),intervals.end(),cmp);
        vector<vector<int>> res;

        res.push_back(intervals[0]);
        for(int i=0;i<intervals.size();i++) {
            if(intervals[i][0] <= res.back()[1]) {
                res.back()[1] = max(intervals[i][1], res.back()[1]);
            }
            else {
                res.push_back(intervals[i]);
            }
        }
        return res;
        
    }
};
相关推荐
左手の明天2 小时前
SLIP 协议封装与解析详解:原理、C 代码与实战案例
linux·c语言·开发语言·c++
海上小飞龙2 小时前
【KMP算法-下篇】同一道题:Java 库函数 2600 微秒,手写 KMP 16 微秒
java·开发语言·算法
青少儿编程课堂3 小时前
后缀自动机解析:本质不同子串与最长重复片段统计
c++·python·算法·bfs·信息学竞赛
朝朝辞暮i3 小时前
C++ 第 12 课:局部变量、作用域、变量生命周期
开发语言·c++·算法
乐迪信息4 小时前
港口船舶逆行怎么管?AI防爆摄像机搭载智能检测算法
大数据·人工智能·深度学习·算法·计算机视觉
无名猿5 小时前
shared_ptr 完全指南:引用计数、控制块与开销
c++·性能优化·内存管理·标准库·现代c++
Sirens.5 小时前
Java并发锁详解:六类锁策略与 synchronized 底层原理
java·前端·算法
和裕5 小时前
全纸结构重型纸箱能否满足 1 吨以上设备出口熏蒸豁免要求?通关合规性全解析
大数据·运维·网络·人工智能·算法
tangguofeng6 小时前
不带头结点的链队操作集(不含InitFlag)(C语言版)
算法