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

avatar

这一题 我们枚举的是每一位中1的出现次数 avatar

234 - 回文链表

进阶: 你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

这题把链表的好多操作都用上了:

  • 找中点:快慢指针

  • 反转链表

整体思路就是找到中点 -> 反转后半链表,得到两个子链表 -> 对比元素 不一致就不满足回文要求

235 - 二叉搜索树的最近公共祖先

肯定是递归搜索了 和root比 一大一小就是当前的root为答案, 不然就往两边走 相等直接返回即可(根据定义)

那个bool判断异或 if((rootval < pval) ^ (rootval < qval)) 是两个之中保证一个成立的意思 简化if的判断条件

236 - 二叉树的最近公共祖先

这里指路图论总结专题 有两个算法 在线:倍增法 和 离线:Tarjan

这里因为就查询一次,所以直接标记法就好了,分别记录从rootpq的路径 重合的就是公共祖先 找到最后一个就是最近公共祖先了

总的来说还是不太正经 正经的LCA问题上面的两个算法还是要背好

237 - 删除链表中的节点

这题没有给任何前驱节点 怎么删呢? 假扮后继

先把node后面的点删了 再把node改成后面删除点的val

238 - 除自身以外数组的乘积

请不要使用除法,且在 O(n) 时间复杂度内完成此题

你可以在常数空间复杂度内完成这个题目吗 (出于对空间复杂度分析的目的,输出数组不被视为额外空间。)

前后缀分解 前后缀分解是一个非常重要的技巧,将数组按照i 分为前半段前缀和后半段后缀 而前缀和后缀都可通过递推来实现;

这里题目要求常数空间复杂度(输出数组不算) 相当于只能开一个数组,这里我们把前缀成绩直接存储在输出数组res中, 在求后缀的过程直接用一个变量sub代替

239 - 滑动窗口最大值

单调队列就是拿来求滑动窗口最值问题的, 直接默写8

注意队列是双端队列 用数组模拟就好

240 - 搜索二维矩阵II

有单调性搜索肯定考虑二分 但本题没有一个合适的全局单调性来处理 -> 很巧妙的一个做法

avatar

Last updated