239. 滑动窗口最大值
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
//双端队列
if(nums.size()==0||k==0)return {};
vector<int>res;
deque<int>de;
for(int i=0;i<k;i++)
{
while(!de.empty()&&de.back()<nums[i])
de.pop_back();
de.push_back(nums[i]);
}
res.push_back(de.front());
for(int i=k;i<nums.size();i++)
{
if(de.front()==nums[i-k])
de.pop_front();
while(!de.empty()&&de.back()<nums[i])
de.pop_back();
de.push_back(nums[i]);
res.push_back(de.front());
}
return res;
//优先队列
priority_queue<pair<int,int> >q;
int n=nums.size();
vector<int>ans;
for(int i=0;i<k;i++)
q.push({nums[i],i});
ans.push_back(q.top().first);
for(int i=k;i<n;i++)
{
q.push({nums[i],i});
while(q.top().second<=i-k)
q.pop();
ans.push_back(q.top().first);
}
return ans;
}
};
993. 二叉树的堂兄弟节点
在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。
如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。
我们给出了具有唯一值的二叉树的根节点 root ,以及树中两个不同节点的值 x 和 y 。
只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true 。否则,返回 false。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
//dfs
int dep[150],fa[150];
bool isCousins(TreeNode* root, int x, int y) {
dfs(root,0,-1);
return dep[x]==dep[y]&&fa[x]!=fa[y];
}
void dfs(TreeNode *root,int d,int f)
{
if(root==NULL) return ;
dep[root->val]=d;
fa[root->val]=f;
dfs(root->left,d+1,root->val);
dfs(root->right,d+1,root->val);
}
//bfs
bool isCousins(TreeNode* root, int x, int y){
queue<pair<TreeNode*,TreeNode*> >q;
q.push({root,NULL});
while(!q.empty())
{
int n=q.size();
vector<TreeNode*> ans;
for(int i=0;i<n;i++)
{
auto cur=q.front().first;
auto parent=q.front().second;
q.pop();
if(cur->val==x||cur->val==y)
ans.push_back(parent);
if(cur->left)q.push({cur->left,cur});
if(cur->right)q.push({cur->right,cur});
}
if(ans.size()==0)continue;
else if(ans.size()==1)return false;
else if(ans.size()==2)return ans[0]!=ans[1];
}
return false;
}
};
50. Pow(x, n)
实现 pow(x, n) ,即计算 x 的整数 n 次幂函数。
class Solution {
public:
double myPow(double x, int n) {
int f=0;
if(n<0)
{
n=abs(n);
f=1;
}
double ans=1.0;
while(n)
{
if(n%2==1)ans=ans*x;
x=x*x;
n/=2;
}
if(f==0)
return ans;
else
return 1.0/ans;
}
};
622. 设计循环队列
设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。
你的实现应该支持如下操作:
MyCircularQueue(k): 构造器,设置队列长度为 k 。
Front: 从队首获取元素。如果队列为空,返回 -1 。
Rear: 获取队尾元素。如果队列为空,返回 -1 。
enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
isEmpty(): 检查循环队列是否为空。
isFull(): 检查循环队列是否已满。
class MyCircularQueue {
public:
vector<int>v;
int first=0;
int end=-1;
int num=0;
int size=0;
MyCircularQueue(int k) {
v.resize(k,0);
size=k;
}
bool enQueue(int value) {
if(num==size)return false;
end=(end+1)%size;
v[end]=value;
++num;
return true;
}
bool deQueue() {
if(num==0)return false;
first=(first+1)%size;
--num;
return true;
}
int Front() {
if(num==0)return -1;
return v[first];
}
int Rear() {
if(num==0)return -1;
return v[end];
}
bool isEmpty() {
if(num!=0)return false;
return true;
}
bool isFull() {
if(num!=size)return false;
return true;
}
};
/**
* Your MyCircularQueue object will be instantiated and called as such:
* MyCircularQueue* obj = new MyCircularQueue(k);
* bool param_1 = obj->enQueue(value);
* bool param_2 = obj->deQueue();
* int param_3 = obj->Front();
* int param_4 = obj->Rear();
* bool param_5 = obj->isEmpty();
* bool param_6 = obj->isFull();
*/
641. 设计循环双端队列
设计实现双端队列。
实现 MyCircularDeque 类:
MyCircularDeque(int k) :构造函数,双端队列最大为 k 。
boolean insertFront():将一个元素添加到双端队列头部。 如果操作成功返回 true ,否则返回 false 。
boolean insertLast() :将一个元素添加到双端队列尾部。如果操作成功返回 true ,否则返回 false 。
boolean deleteFront() :从双端队列头部删除一个元素。 如果操作成功返回 true ,否则返回 false 。
boolean deleteLast() :从双端队列尾部删除一个元素。如果操作成功返回 true ,否则返回 false 。
int getFront() ):从双端队列头部获得一个元素。如果双端队列为空,返回 -1 。
int getRear() :获得双端队列的最后一个元素。 如果双端队列为空,返回 -1 。
boolean isEmpty() :若双端队列为空,则返回 true ,否则返回 false 。
boolean isFull() :若双端队列满了,则返回 true ,否则返回 false 。
class MyCircularDeque {
public:
deque<int>q;
int size;
MyCircularDeque(int k) {
size=k;
}
bool insertFront(int value) {
if(q.size()==size)return false;
q.push_front(value);
return true;
}
bool insertLast(int value) {
if(q.size()==size)return false;
q.push_back(value);
return true;
}
bool deleteFront() {
if(q.size()==0)return false;
q.pop_front();
return true;
}
bool deleteLast() {
if(q.size()==0)return false;
q.pop_back();
return true;
}
int getFront() {
if(q.size()==0)return -1;
return q.front();
}
int getRear() {
if(q.size()==0)return -1;
return q.back();
}
bool isEmpty() {
if(q.size()==0)return true;
return false;
}
bool isFull() {
if(q.size()==size)return true;
return false;
}
};
/**
* Your MyCircularDeque object will be instantiated and called as such:
* MyCircularDeque* obj = new MyCircularDeque(k);
* bool param_1 = obj->insertFront(value);
* bool param_2 = obj->insertLast(value);
* bool param_3 = obj->deleteFront();
* bool param_4 = obj->deleteLast();
* int param_5 = obj->getFront();
* int param_6 = obj->getRear();
* bool param_7 = obj->isEmpty();
* bool param_8 = obj->isFull();
*/