Write an algorithm to determine if a number `n`

is happy.

A **happy number** is a number defined by the following process:

- Starting with any positive integer, replace the number by the sum of the squares of its digits.
- Repeat the process until the number equals 1 (where it will stay), or it
**loops endlessly in a cycle**which does not include 1. - Those numbers for which this process
**ends in 1**are happy.

Return `true`

*if* `n`

*is a happy number, and* `false`

*if not*.

**Example 1:**

Input:n = 19Output:trueExplanation:1^{2}+ 9^{2}= 82 8^{2}+ 2^{2}= 68 6^{2}+ 8^{2}= 100 1^{2}+ 0^{2}+ 0^{2}= 1

**Example 2:**

Input:n = 2Output:false

**Constraints:**

`1 <= n <= 2`

^{31}- 1

**Solution: Simulation**

We can use a hasthable to store all the number we generated so far.

Time complexity: O(L)

Space complexity: O(L)

## C++

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// Author: Huahua class Solution { public: bool isHappy(int n) { auto getNext = [](int x) -> int { int ans = 0; while (x) { ans += (x % 10) * (x % 10); x /= 10; } return ans; }; unordered_set<int> s; while (n != 1) { if (!s.insert(n).second) return false; n = getNext(n); } return true; } }; |

**Optimization: Space reduction**

Since the number sequence always has a cycle, we can use slow / fast pointers to detect the cycle without using a hastable.

Time complexity: O(L)

Space complexity: O(1)

## C++

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// Author: Huahua class Solution { public: bool isHappy(int n) { auto getNext = [](int x) -> int { int ans = 0; while (x) { ans += (x % 10) * (x % 10); x /= 10; } return ans; }; int slow = n; int fast = getNext(n); do { slow = getNext(slow); fast = getNext(getNext(fast)); } while (slow != fast); return slow == 1; } }; |