LeetCode

注意事项

  • 统计单词数直接 int a[300] 这样可以省去 - 'a' 这一步操作。
  • 代码中的 printf 不会影响最后的结果,猜测是去比较返回值。
    • 上一条提到的不会影响结果,但是会影响耗时,所以还是要删除中间的输出。
  • 函数里面定义数组,需要初始化。
    • vector<int>v(10, 0)
    • vector<vector<int>> dp(k, vector<int>(1 << n)); 二维 vector
  • sort 手动传入 cmp 需要是 static 类型
  • sort(a.begin(), a.end(), [](vector<int>&x, vector<int>&y){return x[0]<y[0];});
    • lambda 里面的参数需要是引用,如果是拷贝构造,在 n=1e5 时会超时。
  • 枚举子集 | CP Wiki n 个元素的子集枚举 $$O(3^n)$$ 复杂度
    • 枚举 i 的子集
      • (j - 1) 将 j 最右边的 1 变成 0,得到小于 j 最大的一个二进制数
      • (j - 1) & i 保证一定是 i 的子集
1
2
3
4
5
for (int i = 1; i < (1 << n); ++i) {
for (int j = i; j; j = (j - 1) & i) {
// ...
}
}

id:: cf69c99a-8fe3-418f-b455-48e50d13be0e

  • 0x3f3f3f3f 的十进制是1061109567,是10^9级别的,自身相加不会超过 int 范围,可以 memset 初始化
  • [[vector]] 取指定位置的迭代器
1
2
3
it = a.begin()+4;
it = advance(a.begin(), 4);
it = next(a.begin(), 4);

id:: cd997b4c-c152-4c6f-8c6b-b57235eb15c0

  • 位运算的优先级
    • a+b^c
      • 先算 a+b
  • ?=: 运算符优先级
    • (a[i]^b[k]) + i==0?0:dp[i-1][j]
      • 加法优先级大于 ?=:
  • __builtin_popcount
    • 统计一个 int 中 1 的个数
  • 二进制表示中最低位
    • n & (n - 1)
      • 该位运算技巧可以直接将 n 二进制表示的最低位 1 移除
    • n & (-n)
      • 该位运算技巧可以直接获取 n 二进制表示的最低位的 1
  • set、tuple、map 一起使用
1
2
3
4
5
6
7
8
9
10
11
set<tuple<int, int, int>>use;

// 插入元素
use.emplace({1, 2, 3});

// 删除第一个元素
use.erase(use.begin());

//访问
auto p = *use.begin();
int x = std::get<0>(p);

复盘

补题

网络回响

作者

Ryen Xiang

发布于

2026-02-17

更新于

2026-02-17

许可协议


评论