week24
231 - 2的幂
是2的幂次 就证明 这个数的二进制位只能有一个1;
lowbit运算: 返回保留最后一个1的二进制数 e.g. lowbit(1010) -> 10
其实就是 x & (-x) == x
class Solution {
public:
bool isPowerOfTwo(int n) {
// 这题 2的幂次 证明 二进制只能有一个1
if(n <= 0) return false;
return (n & (-n)) == n;
}
};232 - 用栈实现队列
怎么在栈中找到最早插入的元素? -> 辅助栈 每次插入新元素都插入stk头部
感谢jp人提供的思路
class MyQueue {
public:
stack<int> stk, helper;
public:
/** Initialize your data structure here. */
MyQueue() = default;
/** Push element x to the back of queue. */
void push(int x) {
// 每次插入 都插入到头部
while(stk.size())
{
helper.push(stk.top());
stk.pop();
}
stk.push(x);
while(helper.size())
{
stk.push(helper.top());
helper.pop();
}
}
/** Removes the element from in front of queue and returns that element. */
int pop() {
int res = stk.top();
stk.pop();
return res;
}
/** Get the front element. */
int peek() {
return stk.top();
}
/** Returns whether the queue is empty. */
bool empty() {
return stk.empty();
}
};233 - 数字1的个数
经典的数位DP了 快来复习一下数位DP

这一题 我们枚举的是每一位中1的出现次数 
234 - 回文链表
进阶: 你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
这题把链表的好多操作都用上了:
找中点:快慢指针
反转链表
整体思路就是找到中点 -> 反转后半链表,得到两个子链表 -> 对比元素 不一致就不满足回文要求
235 - 二叉搜索树的最近公共祖先
肯定是递归搜索了 和root比 一大一小就是当前的root为答案, 不然就往两边走 相等直接返回即可(根据定义)
那个bool判断异或 if((rootval < pval) ^ (rootval < qval)) 是两个之中保证一个成立的意思 简化if的判断条件
236 - 二叉树的最近公共祖先
这里指路图论总结专题 有两个算法 在线:倍增法 和 离线:Tarjan
这里因为就查询一次,所以直接标记法就好了,分别记录从root到p和q的路径 重合的就是公共祖先 找到最后一个就是最近公共祖先了
总的来说还是不太正经 正经的LCA问题上面的两个算法还是要背好
237 - 删除链表中的节点
这题没有给任何前驱节点 怎么删呢? 假扮后继
先把node后面的点删了 再把node改成后面删除点的val
238 - 除自身以外数组的乘积
请不要使用除法,且在 O(n) 时间复杂度内完成此题
你可以在常数空间复杂度内完成这个题目吗 (出于对空间复杂度分析的目的,输出数组不被视为额外空间。)
前后缀分解 前后缀分解是一个非常重要的技巧,将数组按照i 分为前半段前缀和后半段后缀 而前缀和后缀都可通过递推来实现;
这里题目要求常数空间复杂度(输出数组不算) 相当于只能开一个数组,这里我们把前缀成绩直接存储在输出数组res中, 在求后缀的过程直接用一个变量sub代替
239 - 滑动窗口最大值
单调队列就是拿来求滑动窗口最值问题的, 直接默写8
注意队列是双端队列 用数组模拟就好
240 - 搜索二维矩阵II
有单调性搜索肯定考虑二分 但本题没有一个合适的全局单调性来处理 -> 很巧妙的一个做法

Last updated