一个很奇怪的递归方式(难道是数学推导???)(leetcode.600)

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);
	}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值