LeetCode202.快乐数

在这里插入图片描述


LeetCode202.快乐数


题目:

  • 编写一个算法来判断一个数 n 是不是快乐数。「快乐数」 定义为:
  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1
  • 如果这个过程 结果为 1,那么这个数就是快乐数。
  • 如果 n 是 快乐数 就返回 true ;不是,则返回 false

示例:

  • 输入: n = 19 n = 19 n=19
  • 输出: t r u e true true
  • 解释:
    • 1 2 + 9 2 = 82 1^2 + 9^2 = 82 12+92=82
    • 8 2 + 2 2 = 68 8^2 + 2^2 = 68 82+22=68
    • 6 2 + 8 2 = 100 6^2 + 8^2 = 100 62+82=100
    • 1 2 + 0 2 + 0 2 = 1 1^2 + 0^2 + 0^2 = 1 12+02+02=1

解题思路:(动规)

unordered_set res记录每个sum是否出现过,若出现过,则返回false。若sum == 1则返回true

版本一:Java

class Solution {
    private int getSum(int n){
        int res = 0;
        while(n > 0){
            int temp = n % 10;
            res += temp * temp;
            n /= 10;
        }
        return res;
    }

    public boolean isHappy(int n) {
        Set<Integer> res = new HashSet<>();
        while(n != 1 && !res.contains(n)){
            res.add(n);
            n = getSum(n);
        }
        return n == 1;
    }
}

版本二:C++

class Solution {
public:
    int getSum(int n){
        int sum = 0;
        while(n){
            sum += (n % 10) * (n % 10);
            n /= 10;
        }
        return sum;
    }

    bool isHappy(int n) {
        unordered_set<int> orcured;
        while(true){
            int sum = getSum(n);
            if(sum == 1) return true;
            if(orcured.find(sum) != orcured.end()) return false;
            else orcured.insert(sum);
            n = sum;
        }
    }
};

时间复杂度: O ( l o g n ) O(logn) O(logn)
空间复杂度: O ( l o g n ) O(logn) O(logn)

你可能感兴趣的:(LeetCode202.快乐数)