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;
        
    }
};
相关推荐
利刃大大3 分钟前
【动态规划:背包问题】完全平方数
c++·算法·动态规划·背包问题·完全背包
wyhwust32 分钟前
数组----插入一个数到有序数列中
java·数据结构·算法
笑非不退34 分钟前
C# c++ 实现程序开机自启动
开发语言·c++·c#
im_AMBER36 分钟前
Leetcode 59 二分搜索
数据结构·笔记·学习·算法·leetcode
gihigo199843 分钟前
基于MATLAB的IEEE 14节点系统牛顿-拉夫逊潮流算法实现
开发语言·算法·matlab
leoufung1 小时前
LeetCode 61. 旋转链表(Rotate List)题解与思路详解
leetcode·链表·list
AA陈超2 小时前
从0开始学习 **Lyra Starter Game** 项目
c++·笔记·学习·游戏·ue5·lyra
甄心爱学习2 小时前
数据挖掘-聚类方法
人工智能·算法·机器学习
q***T5832 小时前
C++在游戏中的Unreal Engine
c++·游戏·虚幻
保持低旋律节奏2 小时前
C++——C++11特性
开发语言·c++·windows