力扣hot100笔记(1)

写在前面:

目前已经写了:

力扣hot100笔记(1):42.接雨水。239.滑动窗口最大值。

一、42.接雨水

时间复杂度:O(n)

思路:

根据示例图观察可得一个柱子接的雨水量=min(它左侧最高柱子高度,它右侧最高柱子高度)-它本身高度。于是用双指针的方法,维护leftMax和rightMax两个变量,left,right两个指针。当left所指向的柱子高度小于right所指向柱子的高度时,分为两种情况:

(1)left和right都指向初始位置,则leftMax一定会小于rightMax,则当前柱子雨水量=leftMax-heightleft,并且left++。

(2)当不指向初始位置时,left之前的位置已经有leftMax一定小于rightMax,因为左右指针不相撞,所以之前位置的rightMax值一定在当前left右侧,如果当前left位置柱子高度也低于右侧则仍然是leftMax一定会小于rightMax。

即(1)(2)情况都是柱子雨水量=leftMax-heightleft。

若是left所指向柱子高度大于right所指向柱子的高度时候同理。

代码:

cpp 复制代码
class Solution {
public:
    int trap(vector<int>& height) {
        int left=0;
        int n=height.size();
        int right=n-1;
        int leftMax=height[0];
        int rightMax=height[n-1];
        int ans=0;
        while(left<right){
            leftMax=max(leftMax,height[left]);
            rightMax=max(rightMax,height[right]);
            if(height[left]<height[right])
            {
                ans+=(leftMax-height[left]);
                left++;
            }
            else
            {
                ans+=(rightMax-height[right]);
                right--;
            }
        }
        return ans;
    }
};

二、239.滑动窗口最大值

时间复杂度O(n)

思路:

取一个双端队列,内部存储的是nums内下标。

遍历nums数组,

(1)当滑动窗口未达到指定k值的时候,i直接尾插入队列,如果尾部值小于等于numsi时,因为i的有效空间比队列内的值更长(队列内的值都在i的前面,比如i在遍历到i=8的时候才脱离滑动窗口,队列内其他值在遍历到i=8之前就已经脱离),并且i的值大于等于尾部值,故尾部值对答案没有影响,可以直接pop。

(2)当滑动窗口达到指定k值的时候,尾部仍然照上方法处理即可保证队列内部存储顺序为从大到小。在此之外还需要考虑头部最大这个值是否在有效期内,不在即pop。

代码:

cpp 复制代码
class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        vector<int>ans;
        deque<int>q;
        int n=nums.size();
        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()&&i-q.front()>=k){
                q.pop_front();
            }
            while(!q.empty()&&nums[i]>nums[q.back()]){
                q.pop_back();
            }
            q.push_back(i);
            ans.push_back(nums[q.front()]);
        }
        return ans;
    }
};
相关推荐
文丑颜不良啊31 分钟前
LeetCode2261~2280题目解析
java·leetcode
无咎.lsy1 小时前
《机器学习》笔记
笔记·机器学习
坤坤子吖2 小时前
Linux网络编程:TCP服务器的多进程与多线程实现
linux·服务器·开发语言·网络·c++·笔记·学习
蒸蒸yyyyzwd4 小时前
后端相关学习笔记。
笔记·学习
旖旎夜光5 小时前
【C++ 基础入门】C++ 多态(上):虚函数、重写、override/final 与抽象类
开发语言·c++·笔记·学习
文丑颜不良啊6 小时前
LeetCode2241~2260题目解析
java·leetcode
文丑颜不良啊6 小时前
LeetCode2321~2340题目解析
java·leetcode
Oll Correct6 小时前
Adobe illustrator 案例十二:视频播放(Media & Video)图标绘制
笔记·ui·adobe·illustrator
叼烟扛炮7 小时前
Linux 学习笔记(五十四):内网穿透实战——用 frp 让外网访问你的私人电脑
linux·服务器·网络·笔记·学习
旖旎夜光8 小时前
【C++ 基础入门】C++ 继承(上):概念、切片、隐藏、默认成员函数与友元
c++·笔记·学习