1. 题目描述
2. 解题思路
记忆化搜索模板题
3. 代码实现
class Solution {
public:
int findIntegers(int n) {
int m = __lg(n);
vector<vector<int>> f(m + 1, vector<int>(2, -1));
function<int(int, int, bool)> func = [&](int i, int pre1,
bool is_limit) -> int {
if (i < 0)
return 1;
// 若是不存在限制且已初始化
if (!is_limit && f[i][pre1] >= 0)
return f[i][pre1];
// 判断当前位是否收到限制
int up = is_limit ? n >> i & 1 : 1;
// 填0的情况
int res = func(i - 1, false, is_limit && up == 0);
// 填1的情况
if (!pre1 && up == 1)
res += func(i - 1, true, is_limit);
// 记录结果
if (!is_limit)
f[i][pre1] = res;
return res;
};
return func(m, false, true);
}
};