397. Integer Replacement - jiejackyzhang/leetcode-note GitHub Wiki
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的二进制表示以0结尾,则n是even,无符号右移一位。
- 若n的二进制表示以1结尾,则n是odd,此时需决定是加1还是减1。我们希望处理后n的'1'越少越好。 因此若n=='*01',则n=n-1;若n=='*11',则n=n+1不会比n-1差。唯一的例外是3,'11->10->1'比'11->100->10->1'好。 因此,当n==3 || ((n>>>1)&1)==0时,n=n-1,否则n=n+1。
public class Solution {
public int integerReplacement(int n) {
int res = 0;
while(n != 1) {
if((n & 1) == 0) {
n >>>= 1;
} else if(n == 3 || ((n >>> 1) & 1) == 0) {
n--;
} else {
n++;
}
res++;
}
return res;
}
}