LeetCode状态压缩题个人总结

题单

78 . 子集
1178. 猜字谜
1601. 最多可达成的换楼请求数目
2151 . 基于陈述统计最多好人数

一些心得:

(1)找到某个公共状态进行遍历,一般对于每个子状态只有0 或 1 两种状态,即要么存在要么不存在。遍历的总数就是 (1 << n);
for(int state = 0;state < (1 << n);state++)
(2)对于任意一个state ,需要遍历state每一位的状态时0还是1,如果是1,代表需要对该数据处理。
所以需要一个循环遍历state的每一位,并过滤出 1 的位置:
if(state & (1 << i))
(3)如何得到一组状态(可能是字符或者别的什么内容)他所对应的state呢?比如 ab,abc ,aabb,ac 。如果压缩状态只判断字符的出现,那么需要一个26位的int 值,分别是11,111,11,101。如何给对应位置记录 1 呢?(1178题)
使用左移取或,将1 左移ASCII码位再取或。
mask |= (1 << (ch - 'a'));

例子: c
000000000000000000000000001
左移三位
00000000000000000000000100
mask取或,有1 则1。完成
(4)如果我要精确state中某一个状态,那就需要是state右移多少位(T2151)
例子:10001 的 第4 位,state >> 4
01000
00100
00010
00001,
& 1 判断,就能判断出是1 还是 0 (同 1为1)
(5)善用 __builtin_popcount(),得到二进制位有多少个1 。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值