【简单】力扣算法题解析LeetCode202:快乐数

关注文末推广名片,即可免费获得本题测试源码

题目来源:LeetCode202:快乐数

问题抽象:判断一个正整数是否为快乐数(通过重复计算各位平方和最终得到 1),需满足以下核心需求:

  1. 快乐数判定规则

    • 初始正整数 n,迭代计算:n = ∑(每位数字的平方)
    • 若迭代最终收敛到 1 → 是快乐数;
    • 若迭代进入无限循环(不含 1)→ 非快乐数。
  2. 循环检测策略

    • 哈希集记录历史值:存储每次迭代结果,若出现重复值则判定循环(非 1);
    • 快慢指针法(空间优化):
      • slow 计算一次迭代,fast 计算两次迭代;
      • slow == fast 且结果非 1 则判定循环。
  3. 迭代终止条件

    • 结果为 1 → 返回 true
    • 检测到循环 → 返回 false
    • 数学性质:循环必含 4→16→37→58→89→145→42→20→4(非快乐数公共环)。
  4. 边界处理

    • 输入 n 为正整数(1 ≤ n ≤ 2^31-1);
    • n=1 时直接返回 true
    • 大数优化:迭代过程数值快速衰减(如 999→243),无需担心溢出。

输入:正整数 n
输出:布尔值 true/false(表示是否为快乐数)


解题思路

要判断一个数是否是快乐数,关键在于检测计算过程中是否会出现循环。解题思路如下:

  1. 问题分析:快乐数的计算过程是不断将数字替换为各位数字的平方和。若最终能得到 1,则是快乐数;否则会进入不包含 1 的循环。
  2. 循环检测:使用快慢指针法(Floyd Cycle Detection)检测循环:
    • 慢指针:每次计算一次平方和。
    • 快指针:每次计算两次平方和。
    • 如果快指针变为 1,说明是快乐数。
    • 如果快慢指针相遇(值相等)且不为 1,说明进入循环,不是快乐数。
  3. 优化点
    • 空间优化:快慢指针法只需常数空间,避免使用 HashSet 存储中间结果。
    • 时间优化:平方和计算高效,且快指针能快速检测到循环或 1。
  4. 辅助函数getNext 函数计算数字的平方和。

代码实现(Java版)🔥点击下载源码

class Solution {
    public boolean isHappy(int n) {
        int slow = n;            // 慢指针初始化为 n
        int fast = getNext(n);   // 快指针初始化为 n 的下一个数(一次平方和)
        
        // 当快指针不为1且快慢指针不相等时继续循环
        while (fast != 1 && slow != fast) {
            slow = getNext(slow);         // 慢指针移动一步
            fast = getNext(getNext(fast)); // 快指针移动两步
        }
        
        // 若快指针为1,则是快乐数;否则进入循环,不是快乐数
        return fast == 1;
    }
    
    // 辅助函数:计算数字 n 的各位平方和
    private int getNext(int n) {
        int sum = 0;
        while (n != 0) {
            int digit = n % 10;   // 取最后一位数字
            sum += digit * digit; // 累加平方
            n /= 10;              // 移除最后一位
        }
        return sum;
    }
}

代码说明

  1. 快慢指针机制
    • 慢指针 (slow):每次调用一次 getNext,模拟单步计算。
    • 快指针 (fast):每次调用两次 getNext,模拟双步计算。
    • 终止条件
      • fast == 1,说明到达快乐数终点,返回 true
      • slow == fast 且不为 1,说明进入循环,返回 false
  2. 辅助函数 getNext
    • 通过取模 (% 10) 和整除 (/ 10) 逐位计算平方和。
    • 时间复杂度:O(log n),其中 log n 是数字的位数。
  3. 整体复杂度
    • 时间复杂度:O(log n),平方和计算迅速收敛,快慢指针高效检测循环。
    • 空间复杂度:O(1),仅使用常数额外空间。

提交详情(执行用时、内存消耗)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

达文汐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值