力扣-剑指offer所有题

Posted 行码阁119

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣-剑指offer所有题相关的知识,希望对你有一定的参考价值。

第27天  单向队列

剑指 Offer 59 - I. 滑动窗口的最大值https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof/

 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。

输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7] 
解释: 

  滑动窗口的位置                最大值
---------------               -----
[1  3  -1] -3  5  3  6  7       3
 1 [3  -1  -3] 5  3  6  7       3
 1  3 [-1  -3  5] 3  6  7       5
 1  3  -1 [-3  5  3] 6  7       5
 1  3  -1  -3 [5  3  6] 7       6
 1  3  -1  -3  5 [3  6  7]      7

滑动窗口+单调队列实现

class Solution 
public:
    class myqueue 
    public:
        deque<int> q;

        void push(int val) 
            while(!q.empty() && q.back() < val) 
                q.pop_back();
            
            q.push_back(val);
        

        void pop(int val) 
            if(!q.empty() && q.front() == val) 
                q.pop_front();
            
        

        int peek() 
            return q.front();
        
    ;
    vector<int> maxSlidingWindow(vector<int>& nums, int k) 
        vector<int> result;
        if(k == 0) return result;
        myqueue deq;
        int i = 0;
        for(; i < k; i++) 
            deq.push(nums[i]);
        
        for(; i < nums.size(); i++) 
            result.push_back(deq.peek());
            deq.pop(nums[i - k]);
            deq.push(nums[i]);
        
        result.push_back(deq.peek());
        return result;
    
;

剑指 Offer 59 - II. 队列的最大值https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof/

请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。

若队列为空,pop_front 和 max_value 需要返回 -1

示例 1:

输入: 
["MaxQueue","push_back","push_back","max_value","pop_front","max_value"]
[[],[1],[2],[],[],[]]
输出: [null,null,null,2,1,2]
示例 2:

输入: 
["MaxQueue","pop_front","max_value"]
[[],[],[]]
输出: [null,-1,-1]
//超时
class MaxQueue 
public:
    unordered_map<int, int> map;
    queue<int> q;
    priority_queue<int> p;
    MaxQueue() 

    
    
    int max_value() 
        if(p.empty()) return -1;
        while(map[p.top()] == 0)  
            p.pop();
        
        int temp = p.top();
        return temp;
    
    
    void push_back(int value) 
        map[value]++;
        q.push(value);
        p.push(value);
    
    
    int pop_front() 
        if(q.empty()) return -1;
        map[q.front()]--;
        int temp = q.front();
        q.pop();
        return temp;
    
;
//运行成功
class MaxQueue 
public:
    deque<int> deq;
    queue<int> q;
    MaxQueue() 

    
    
    int max_value() 
        if(deq.empty()) return -1;
        return deq.front();
    
    
    void push_back(int value) 
        q.push(value);
        while(!deq.empty() && deq.back() < value) 
            deq.pop_back();
        
        deq.push_back(value);
    
    int pop_front() 
        if(q.empty()) return -1;
        if(!deq.empty() && q.front() == deq.front()) 
            deq.pop_front();
        
        int temp = q.front();
        q.pop();
        return temp;
    
;

以上是关于力扣-剑指offer所有题的主要内容,如果未能解决你的问题,请参考以下文章

力扣 - 102二叉树的层序遍历(剑指Offer - 面试题32:从上到下打印二叉树)

力扣(LeetCode)剑指offer刷题笔记(java),已完结!!!

力扣(LeetCode)剑指offer刷题笔记(java),已完结!!!

精选力扣500题 第62题 剑指 Offer 54. 二叉搜索树的第k大节点c++/java详细题解

精选力扣500题 第63题 剑指 Offer 36. 二叉搜索树与双向链表c++/java详细题解

精选力扣500题 第33题 剑指Offer 22. 链表中倒数第k个节点c++ / java 详细题解