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的数量。函数参数包括pren,其中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的值。通过优化递归逻辑,我们可以确保函数的正确性,从而实现预期的功能。

    上一篇:Leetcode 401. 二进制手表(DAY 103) ---- 回溯算法学习期
    下一篇:Leetcode 32. 最长有效括号(DAY 102) ---- Leetcode Hot 100

    发表评论

    最新留言

    感谢大佬
    [***.8.128.20]2025年04月14日 23时49分40秒