题意:给出一个正数n,如果n为偶数则n = n /2,如果n为奇数,则n=n + 1或者n=n-1,求其变为1所需要的最少步数。
思路:刚开始用记忆化的dp,当数值比较大时,提示栈溢出。在判断是n=n+1或者n=n-1时总是选择结果位为1最小的操作
代码如下:
public class Solution
{
public int integerReplacement(int n)
{
int ans = 0;
while (n != 1)
{
if ((n & 1) == 0) n >>>= 1;
else
{
if (n == 3 || Integer.bitCount(n + 1) > Integer.bitCount(n - 1))
{
--n;
}
else ++n;
}
ans++;
}
return ans;
}
}