397. Integer Replacement 题解
题目描述:
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
orn - 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 我们将对它进行“调整”,当为偶数时,n=n/2,当为奇数时,n=n+1 或 n=n-1(奇数调整为偶数),……当这个数调整为 1 时停止,我们记录调整的次数并返回最小的调整次数。
题目的要求是取调整的最小次数,因为当 n 为偶数时,只需要进行 n/2 运算,但是当 n 为奇数时,我们需要判断到底是对 n 加一,还是对 n 减一。我们发现,能让 n 尽快变为 1 的条件是尾数上的 0 相比较越多越好。所以,我们需要判断 n+1后面的 0 多,还是 n-1 后面的 0 多,选取多的为调整的数。 最后需要注意当 n=3 时的情况。
代码:
class Solution {
public:
int integerReplacement(int n) {
int ans=0;
if(n==INT_MAX){
return 32;
}
while(n!=1){
if((n & 1)==0){
n=n>>1;
ans++;
}
else{
if(n==3){
n=2;
ans++;
}
else{
if(countTail0(n+1)>countTail0(n-1)){
n=n+1;
ans++;
}
else{
n=n-1;
ans++;
}
}
}
}
return ans;
}
int countTail0(int m){
int count0=0;
while((m & 1)==0){
m=m>>1;
count0++;
}
return count0;
}
};