快乐数[环类问题之快慢指针]

快慢指针

  • 前言
  • 一、快乐数
  • 二、快慢指针
  • 总结
  • 参考文献

前言

分析题意,出现死循环相关问题,则属于环类问题,需用紧密联系的知识点快慢指针解决。保持快慢指针对环问题/死循环问题的敏感性。

一、快乐数

快乐数[环类问题之快慢指针]_第1张图片

二、快慢指针

package everyday.doublePoint;

// 快乐数
public class IsHappy {
    /*
    target:将一个数变成另一个数,按照一条固定的路径变下去,变到1就是快乐数,进入死循环就是非块乐数。
    这就类似一个路径可能有环,可能无环。
    最关键的地方在于判定是否有环,无环则是快乐数,有环则是非快乐数。
    最直观的想法就是hash记录。
    但是对于环问题,和其紧密关联的知识点就是快慢指针,如果快慢指针相碰,则有环,否则快指针走到末尾。
     */
    public boolean isHappy(int n) {
        // 初始化快慢指针位置,快的在前,慢的再后。
        int fast = getNext(n), slow = n;
        // 一快一慢开始寻找。
        while (fast != 1 && fast != slow) {
            // fast走两步,slow走一步,要是有环必相碰,否则fast走到末尾的1.
            fast = getNext(getNext(fast));
            slow = getNext(slow);
        }
        // 看看是因为环结束,还是因为fast走到末尾结束。
        return 1 == fast;
    }

    private int getNext(int n) {
        int sum = 0;
        while (n > 0) {
            int mod = n % 10;
            sum += mod * mod;
            // 更新n
            n /= 10;
        }
        return sum;
    }
}

总结

1)保持快慢指针对环问题/死循环问题的敏感性。

参考文献

[1] LeetCode 快乐数

你可能感兴趣的:(数据机构与算法,环问题,死循环,快慢指针,双指针,Java)