题目:
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;
}
};