一些比较巧妙的操作

判断一个数是不是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, 这样就可以按照顺序枚举子集了。

严格递增子序列

354. 俄罗斯套娃信封问题

给你一个二维整数数组 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) {
   ...
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值