LeetCode-397:Integer Replacement (整数变1的步骤)

题目:

Given a positive integer n and you can do operations as follow:

If n is even, replace n with n/2.
If n is odd, you can replace n with either n + 1 or n – 1.
What is the minimum number of replacements needed for n to become 1?

例子:

Example 1:

Input:
8

Output:
3

Explanation:
8 -> 4 -> 2 -> 1

Example 2:

Input:
7

Output:
4

Explanation:
7 -> 8 -> 4 -> 2 -> 1
or
7 -> 6 -> 3 -> 2 -> 1

问题解析:

给定整数n,将整数逐步替换为1. 若为偶数则以n/2替换,若为奇数则可以以n+1或者n-1替换。求最小的替换步骤。

链接:

思路标签

数学思想动态规划递归(超时)

解答:

  • 题目看似非常容易,但是在过程中会遇到很多问题。
  • 使用简单的递归过程,会超时,复杂度高;
  • 用数学来简化递归过程:
    • 每次的操作均是变为下一个数组,并+1,所以我们记录变化的次数即可;
    • 当n为偶数时,直接以n/2替换即可;
    • 当n为奇数时,如果(n+1) % 4 == 0,也就是n+1是4的倍数,那么用n+1替换是可以减小步骤的;其他情况下使用n-1替换总是最小的。
  • 另外,int的最大值为2^32-1,所以如果直接用上面的方法+1,则编程2^32发生溢出,所以我们需要对这种情况进行单独处理。使INT_MAX来表示。
class Solution {
public:
    int integerReplacement(int n) {
        if(n == INT_MAX) return 32;

        int count = 0;
        while(n > 1){
            if(n % 2 == 0)
                n = n/2;
            else{
                if((n+1)%4 == 0 && (n-1 != 2))
                    n++;
                else
                    n--;
            }
            count++;
        }

        return count;
    }
};
点赞