Leetcode 每日一题 202.快乐数

目录

题意

算法思路

过题图片

算法实现

代码解析

复杂度分析

题目链接

结论


题意

判断正整数 n 是不是快乐数。

快乐数定义:

(1)每次将正整数替换为它每个位置上的数字的平方和。

(2)重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。

(3)如果可以变为 1,这个数就是快乐数。

示例

输入:19

输出:true

解释:

1² + 9² = 82

8² + 2² = 68

6² + 8² = 100

1² + 0² + 0² = 1

提示

1 <= n <= 2^31 -1

算法思路

这个问题的关键在于处理可能的无限循环。如果一个数最终会进入一个循环,那么它肯定不是快乐数。因此,我们可以使用哈希集合来记录在迭代过程中出现过的数。如果新生成的数已经在哈希集合中,那么我们可以确定这个数不是快乐数,因为它已经进入了循环。

过题图片

算法实现

以下是使用Java语言实现的算法:

复制代码
import java.util.Set;
import java.util.HashSet;

class Solution {
    private int getNextNumber(int n) {
        int res = 0;
        while (n > 0) {
            int temp = n % 10;
            res += temp * temp;
            n = n / 10;
        }
        return res;
    }
    
    public boolean isHappy(int n) {
        Set<Integer> record = new HashSet<>();
        while (n != 1 && !record.contains(n)) {
            record.add(n);
            n = getNextNumber(n);
        }
        return n == 1;
    }
}

代码解析

  1. getNextNumber 方法:这个方法用于计算给定数的下一个数,即每个位置上的数字的平方和。它通过不断取模和除法操作来实现。

  2. isHappy 方法 :这是主要的算法实现。我们使用一个哈希集合 record 来记录出现过的数。在循环中,我们不断计算下一个数,并检查这个数是否已经在 record 中。如果已经在 record 中,说明进入了循环,返回 false。如果计算得到的数为1,说明找到了快乐数,返回 true

复杂度分析

  • 时间复杂度:最坏情况下,我们需要遍历所有可能的数直到找到1或者确定循环。在最坏情况下,这个算法的时间复杂度是 O(k),其中 k 是快乐数序列的长度。对于非快乐数,时间复杂度取决于循环的长度,但在实际应用中,这个循环通常不会太长。

  • 空间复杂度:我们使用了一个哈希集合来存储已经出现过的数,因此空间复杂度是 O(k),其中 k 是不同数的数量。

题目链接

202. 快乐数 - 力扣(LeetCode)

结论

通过使用哈希集合来记录已经出现过的数,我们可以有效地判断一个数是否为快乐数。这种方法简单而高效,能够处理可能的无限循环问题。

写在最后

如果你觉得有帮助到你,请给题解点个赞和收藏,让更多的人看到呀~

也欢迎你关注我,解锁更多图解 LeetCode,一起玩转数据结构与算法!

我是luckilyil,我们下次见!

相关推荐
AC__dream4 分钟前
2024秋招-字节跳动-算法岗笔试
数据结构·算法
一叶落4389 分钟前
LeetCode 151. 反转字符串中的单词(C语言)【双指针 + 字符串处理】
c语言·数据结构·算法·leetcode
_olone10 分钟前
牛客每日一题:刷题统计(Java)
java·算法·容斥原理·牛客
无敌憨憨大王11 分钟前
DFS(深搜)
算法·深度优先·图论
junnhwan11 分钟前
LeetCode Hot 100——栈
java·数据结构·算法·leetcode·hot 100
sqyno1sky14 分钟前
代码动态生成技术
开发语言·c++·算法
圣保罗的大教堂15 分钟前
leetcode 1727. 重新排列后的最大子矩阵 中等
leetcode
superior tigre16 分钟前
347 前k个高频元素
数据结构·算法·leetcode
2401_8535765020 分钟前
C++中的策略模式变体
开发语言·c++·算法
m0_5281744524 分钟前
C++中的策略模式实战
开发语言·c++·算法