判断一个数是不是2的整数倍
if ( !(x & (x - 1)) )
假设 x 是 2 的整数倍,比如 x = 4, 则他的二进制是 1000, 减去 1, 则是 0111,二者相与,结果为0.
枚举一个二进制集合的子集
二进制集合的子集 意思是:
假设某个二进制为 1101, 那么他的子集分别是 1101, 1100, 1001, 1000, 0101, 0100, 0001
int bset; // bset 是要枚举子集的集合
for (int i = bset; i; i = (i - 1) & bset) {...}
循环的意思是,每次都把当前数二进制的最后一位 1 之后的所有二进制位置 1, 这样就可以按照顺序枚举子集了。
严格递增子序列
给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度。
当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。
计算 最多能有多少个 信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。
注意:不允许旋转信封。
来源:力扣(LeetCode)
初看很简单,分别按照第一二维排序,然后找到最长不下降子序列即可。但是转移的时候需要判断长和宽是不是均小于当前的信封,比较麻烦。
有一种做法是,第一维度升序,第二维降序,然后找严格递增子序列。首先第一维度相同不需要判断,因为降序,所以后面的永远不会包括前面的信封。然后由于严格递增,所以长度不一致但宽度相同的并且挨着的情况也可以解决。
另外可以使用二分来进行优化,遍历到当前的高度的时候,如果比末尾元素高就直接在尾部添加;否则找到第一个比他小的元素,更新下一个元素即可。
关注贡献
验证二叉树的前序序列化
之前一直考虑规律,但是规律找到一半放弃了,其实已经很接近了。
这种问题要考虑贡献,比如这个题,每增加一个数字,就会增加1个可供插入元素的位置,每增加一个#,就会减少一个可供插入元素的位置。所以只要计数就行了。Medium的题还是要多想一想,应该都能做得出来。
tuple
有时可以代替结构体。
tuple<T1, T2, ..., Tn>
具体用法: https://blog.csdn.net/sevenjoin/article/details/88420885
优先队列使用lambda作为自定义比较函数
https://blog.csdn.net/liu2012huan/article/details/52932494
decltype
以一个普通表达式作为参数,返回该表达式的类型
https://www.cnblogs.com/QG-whz/p/4952980.html
用栈来实现iterator
没有想到用栈,另外之中const型的返回值的处理,需要研究一下。
https://leetcode-cn.com/problems/flatten-nested-list-iterator/submissions/
map元素的遍历
unordered_map<char, int> mp;
for (auto &[ch, num] : mp) {
...
}