Happy Number - slow fast Approach

 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 = 19

Output: true

Explanation:

12 + 92 = 82

82 + 22 = 68

62 + 82 = 100

12 + 02 + 02 = 1

Example 2:


Input: n = 2

Output: false

 


Constraints:


1 <= n <= 2^31 - 1


 Method 1: Floyd’s Cycle Detection Algorithm

🔹 Logic:

  • Think of the process as forming a linked list:

    • Each number points to the next number formed by sum of squares of digits

  • Use slow and fast pointers:

    • slow moves 1 step

    • fast moves 2 steps

  • If a cycle exists → slow == fast

  • If fast reaches 1 → Happy Number


public class Solution {
    public boolean isHappy(int n) {
        int slow = n;
        int fast = getNext(n);

        while (fast != 1 && slow != fast) {
            slow = getNext(slow);
            fast = getNext(getNext(fast));
        }

        return fast == 1;
    }

    private int getNext(int num) {
        int sum = 0;
        while (num > 0) {
            int digit = num % 10;
            sum += digit * digit;
            num /= 10;
        }
        return sum;
    }
}

🔹 Time and Space:

  • Time: O(log n * k) (where k is number of digits)

  • Space: O(1)

Method 2-

Method 2: Using HashSet

🔹 Logic:

  • Keep storing all visited numbers in a Set.

  • If a number is repeated → cycle → Not Happy

  • If we reach 1 → Happy

🔹 Java Code:

public class Solution {
    public boolean isHappy(int n) {
        Set<Integer> seen = new HashSet<>();

        while (n != 1 && !seen.contains(n)) {
            seen.add(n);
            n = getNext(n);
        }

        return n == 1;
    }

    private int getNext(int num) {
        int sum = 0;
        while (num > 0) {
            int digit = num % 10;
            sum += digit * digit;
            num /= 10;
        }
        return sum;
    }
}

🔹 Time and Space:

  • Time: O(log n * k)

  • Space: O(n) for HashSet


Comments

Popular posts from this blog

Two Sum II - Input Array Is Sorted

Comparable Vs. Comparator in Java

Increasing Triplet Subsequence