力扣-剑指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详细题解