Leetcode.600 不含连续1的非负整数
给定一个正整数 n
,请你统计在 [0, n]
范围的非负整数中,有多少个整数的二进制表示中不存在 连续的 1 。
看的大哥的思路:
/*
提供一个很简单的思路,设题目描述的结果为 f(n),我们可以先不妨设 n>= 4(这样n的二进制表示至少有3位)
设 x 是满足条件的一个数,考虑 x 的最后一位,
如果是 0,则有 (x = 2*a + 0 <= n) => a <= n/2
如果是 1,则 x 倒数第二位必定是 0(否则不满足条件)
从而 (x= 4*a +1 <=n) => a<= (n-1)/4
综上得到 f(n) = f(n/2)+f((n-1)/4)
使用哈希表记忆化递归即可
作者:芙门永存
链接:https://leetcode.cn/problems/non-negative-integers-without-consecutive-ones/solutions/2869991/di-gui-by-liu-dong-yu-f-b6m5/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/
我自己的想法:
(蚌埠的状态,思路是似懂非懂的,代码是通过的,现在只能理解自己这一种找规律的思路)
》
map集合存放的n=map.first的时候,[0, map.first]中符合题意要求的数个数也就是map.second
》
还是没懂那个公式是怎么来的QAQ
我从4列到了13感觉这个公式可能找规律出来的?
4=2+0
5=2+1
6=3+1
7=3+1
8=4+1
9=4+2
10=5+2
11=5+2
12=6+2
13=6+3
…
看起来像是左面都是n/2,右面都是(n-1)/4(然后除法交给位运算就可以了)
但是感觉这个公式不应该是这么出来的
code:
class Solution {
public:
unordered_map<int, int> map{ {0,1},{1,2},{2,3},{3,3} };
int findIntegers(int n) {
auto it = map.find(n);
if (it != map.end()) return it->second;
else return map[n] = \
findIntegers(n >> 1) + findIntegers((n - 1) >> 2);
}
};