Leetcode:202. 快乐数
题目描述
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。
如果 n 是快乐数就返回 True ;不是,则返回 False 。
示例:
输入:19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
思路
思路1 递推+哈希表记录
使用一个哈希表依次记录10进制各个位的平方和,最后判断最后输入的值是否为1
思路2 递推+快慢指针
递推下一个数是一样的,可以通过快慢指针的方式判断是否是快乐数
代码
代码1
class Solution {
public boolean isHappy(int n) {
if (n <= 0){
return false;
}
Set intSet = new HashSet();
while (n != 1 && !intSet.contains(n)){
intSet.add(n);
n = getHappy(n);
}
return n == 1;
}
private int getHappy(int n){
int result = 0;
int tempNum = 0;
while (n != 0){
tempNum = n % 10;
result += tempNum * tempNum;
n /= 10;
}
return result;
}
}
代码2
class Solution {
public boolean isHappy(int n) {
if (n <= 0){
return false;
}
int fast = getHappy(n);
int slow = n;
while (fast != 1 && slow != fast){
fast = getHappy(getHappy(fast));
slow = getHappy(slow);
}
return fast == 1;
}
private int getHappy(int n){
int result = 0;
int tempNum = 0;
while (n != 0){
tempNum = n % 10;
result += tempNum * tempNum;
n /= 10;
}
return result;
}
}
复杂度分析
思路1时间复杂度
$O(logn)$
思路1空间复杂度
$O(logn)$
思路2时间复杂度
$O(logn)$
思路2空间复杂度
$O(1)$