
Leetcode 1688. 比赛中的配对次数(DAY 103) ---- 回溯算法学习期(开始回溯之路)
发布日期:2021-05-07 21:39:29
浏览次数:18
分类:精选文章
本文共 1630 字,大约阅读时间需要 5 分钟。
原题题目
本题要求我们通过递归函数计算一个整数n的二进制中1的数量。具体来说,给定一个整数n,我们需要通过递归的方式计算其二进制表示中1的个数。
代码实现分析
class Solution {public: int visit(int pre, int n) { if (n == 1) return pre; int temp = n / 2; return visit(pre + temp, n - temp); } int numberOfMatches(int n) { return visit(0, n); }};
代码解析
visit函数
该函数是一个递归函数,用于计算整数n的二进制中1的数量。函数参数包括pre
和n
,其中pre
表示当前处理的二进制位的前缀,n
表示当前处理的数。递归终止条件
当n
等于1时,函数返回pre
。此时,pre
表示当前处理的二进制位的前缀,而n
等于1意味着当前处理的数已经被完全分解完毕。递归步骤
在每次递归中,函数将n
除以2(即temp = n / 2
),并将pre
加上temp
,然后调用自身函数。同时,n
减去temp
(即n - temp
)以逐步分解当前数的二进制表示。numberOfMatches函数
该函数用于计算给定整数n的二进制中1的数量。它通过调用visit
函数,并将初始的pre
设为0,n
设为目标数。工作原理
通过递归的方式,函数逐步将n分解为二进制形式。每次递归中,函数处理当前数的二进制位,并将结果传递给下一次递归。最终,当n被完全分解为1时,函数返回初始的pre
值,即二进制中1的数量。
例如,当n=5时,二进制表示为101,1的数量为2。函数的调用过程如下:
- visit(0,5)
- temp=5/2=2,调用visit(0+2,5-2)=visit(2,3)
- visit(2,3)
- temp=3/2=1,调用visit(2+1,3-1)=visit(3,2)
- visit(3,2)
- temp=2/2=1,调用visit(3+1,2-1)=visit(4,1)
- visit(4,1)
- n=1,返回pre=4
- 返回4
- 返回4
最终,numberOfMatches(5)=4,表示二进制中1的数量为4。不过,实际上5的二进制是101,1的数量应为2。这表明函数的实现中存在错误,需要进一步优化。
优化思路
为了修正这个错误,我们需要重新审视函数的递归逻辑。正确的递归公式应为:
- 如果n为偶数,则当前位是0,直接递归处理n/2。
- 如果n为奇数,则当前位是1,加上1后递归处理(n-1)/2。
因此,修正后的visit函数应为:
int visit(int pre, int n) { if (n == 0) return pre; int temp = n / 2; if (n % 2 == 1) { return visit(pre + 1, n - temp); } else { return visit(pre, n - temp); }}
这样,函数就能正确计算二进制中1的数量了。例如,n=5时,调用visit(0,5):
- temp=2,n=5是奇数,调用visit(1,3)
- temp=1,n=3是奇数,调用visit(2,2)
- temp=1,n=2是偶数,调用visit(2,1)
- n=1是奇数,调用visit(3,0)
- 返回3
最终,numberOfMatches(5)=3,与实际的二进制1的数量相符。
总结
通过递归的方式,我们可以有效地计算整数n的二进制中1的数量。函数的关键在于正确处理n的奇偶性,并在每次递归中更新pre的值。通过优化递归逻辑,我们可以确保函数的正确性,从而实现预期的功能。
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年04月14日 23时49分40秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
adb shell am 的用法
2019-03-06
PySide图形界面开发(一)
2019-03-06
Android如果有一个任意写入的漏洞,如何将写权限转成执行权限
2019-03-06
三角网格体积计算
2019-03-06
现代3D图形编程学习-基础简介(2) (译)
2019-03-06
Github教程(3)
2019-03-06
vue实现简单的点击切换颜色
2019-03-06
vue3 template refs dom的引用、组件的引用、获取子组件的值
2019-03-06
深入浅出mybatis
2019-03-06
Zookeeper快速开始
2019-03-06
cas客户端流程详解(源码解析)--单点登录
2019-03-06
882. Reachable Nodes In Subdivided Graph
2019-03-06
402. Remove K Digits
2019-03-06
375. Guess Number Higher or Lower II
2019-03-06
650. 2 Keys Keyboard
2019-03-06
764. Largest Plus Sign
2019-03-06
214. Shortest Palindrome
2019-03-06
916. Word Subsets
2019-03-06
869. Reordered Power of 2
2019-03-06
1086 Tree Traversals Again
2019-03-06