首页 > 其他分享 >剑指offer——Day27 栈与队列(困难)

剑指offer——Day27 栈与队列(困难)

时间:2023-02-09 12:55:43浏览次数:50  
标签:deque nums 队列 deq Day27 offer back int max

Day27 2023.2.9 栈&队列(困难)

剑指Offer 59 - Ⅰ. 滑动窗口的最大值

自己实现

这种滑动窗口的题直接用双指针来做了,做出来了,正确性是对的,但是时间太长了,超出时间限制了,先把代码贴这里然后看题解吧

代码如下:

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        int len=nums.size();
        if(len==0)return {};
        vector<int> res;
        int left=0,right=left+k-1;
        int max=INT_MIN;
        for(int i=left;i<=right;i++){
            if(nums[i]>max)max=nums[i];
        }
        res.push_back(max);
        int flag=1;
        for(;left<len-k;){
            if(nums[left]==max){
                flag=0;
                max=INT_MIN;
            }
            left++;
            right=left+k-1;
            if(flag){
                if(nums[right]>max)max=nums[right];
            }
            else{
                flag=1;
                for(int i=left;i<=right;i++){
                    if(nums[i]>max)max=nums[i];
                }
            }
            res.push_back(max);
        }
        return res;
    }
};

题解

题解使用的是双向队列来做的,具体过程就看代码应该就能理解了,即维护一个非严格递减的队列,每次取队首元素即可

代码如下:

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        if(nums.size() == 0 || k == 0) return {};
        deque<int> deque;
        vector<int> res;
        for(int j = 0, i = 1 - k; j < nums.size(); i++, j++) {
            // 删除 deque 中对应的 nums[i-1]
            if(i > 0 && deque[0] == nums[i - 1])
                deque.pop_front();
            // 保持 deque 递减
            while(deque.size()!=0 && deque[deque.size()-1] < nums[j])
                deque.pop_back();
            deque.push_back(nums[j]);
            // 记录窗口最大值
            if(i >= 0)
                res.push_back(deque[0]);
        }
        return res;
    }
};

代码表现

hint

  • 积累了C++的一个STL:双向队列deque,还挺好用

面试题59 - Ⅱ. 队列的最大值

自己实现

这个地方还是用双向队列,只是把它从问题里面抽象出来了,其实是一样的

代码如下:

class MaxQueue {
    queue<int> que;
    deque<int> deq;
public:
    MaxQueue() { }

    int max_value() {
        return deq.empty() ? -1 : deq.front();
    }

    void push_back(int value) {
        que.push(value);
        while(!deq.empty() && deq.back() < value)
            deq.pop_back();
        deq.push_back(value);
    }

    int pop_front() {
        if(que.empty()) return -1;
        int val = que.front();
        if(val == deq.front())
            deq.pop_front();
        que.pop();
        return val;
    }
};

/**
 * Your MaxQueue object will be instantiated and called as such:
 * MaxQueue* obj = new MaxQueue();
 * int param_1 = obj->max_value();
 * obj->push_back(value);
 * int param_3 = obj->pop_front();
 */

代码表现

标签:deque,nums,队列,deq,Day27,offer,back,int,max
From: https://www.cnblogs.com/cspzyy/p/17104904.html

相关文章

  • 算法15:冷门面试题_队列实现栈,栈实现队列
     经常有些面试官很变态,一般都是老阴逼级别的,喜欢问一些变态的问题。但是,反过来思考一下,这些题目也确实具备一些动手的能力,变相能够考查面试者的coding能力。面试一:怎么......
  • C/C++ 数据结构链式队列的定义与实现
    #include<iostream>#include<Windows.h>usingnamespacestd;typedefstruct_QNode{intdata;struct_QNode*next;}QNode;typedefstruct{QNode......
  • 消息队列解析Message
    消息队列生产者@AutowiredprivatefinalAmqpTemplateamqpTemplate;publicvoidtest(){Map<String,Object>testMap=Maps.newHashMap();testMap.put(......
  • DHCP Offer
    No.TimeSourceDestinationProtocol新列Info30520.101465192.168.43.1255.255.255.255DHCP351DHCPOffer-TransactionID0x......
  • 由一次生产事故思考队列在实际项目中的应用价值
    话说从一名.Neter转到Java开发也已经有3年多时间了,期间也积累了一些经验。今天就来谈谈RabbitMQ在实际项目中的应用。那是2020年的某个周末,突然收到反馈,商城页......
  • 队列的顺序存储
      #include<iostream>usingnamespacestd;#defineMAXSize10typedefintElemtype;typedefstruct{ Elemtypedata[MAXSize]; intfront,rear;}SqQueue;boolIsEmp......
  • 剑指offer——Day26 字符串(中等)
    Day262023.2.8字符串(中等)剑指Offer20.表示数值的字符串自己实现这个题自己实现就是要逐字符去判断是不是数字,这个就是暴力解法了,看看题解有没有更直接简便的解法题......
  • 【tyvj1305】最大子序和(单调队列)
    problem给你一个长为n的序列求一个长不超过m的连续子段,使子段和最大solution如果n<=10^3,我们很容易写出枚举(s是前缀和,区间[l,r]的和就是s[r]-s[l-1]。枚举l,r即可。for(int......
  • 【POJ2259】Team Queue(队列,模拟)
    problem有n个小组,进行排队。当一个人来到队伍时,若队伍中有自己小组成员时,他就直接站到其后面如果没有,则站到队伍最后面,形成自己小组的第一个入队元素。出队列时,给出出队指令......
  • 阻塞式并发队列
    --BlockingQueue:阻塞式队列--可以实现生产者消费者模式 --LinkedBQ:链表实现    --ArrayBQ:数组实现,有限队列    --Delay......