给定一个正整数 n,你可以做如下操作:
1. 如果 n 是偶数,则用 n / 2
替换 n。
2. 如果 n 是奇数,则可以用 n + 1
或n - 1
替换 n。
n 变为 1 所需的最小替换次数是多少?
示例 1:
输入: 8 输出: 3 解释: 8 -> 4 -> 2 -> 1
示例 2:
输入: 7 输出: 4 解释: 7 -> 8 -> 4 -> 2 -> 1 或 7 -> 6 -> 3 -> 2 -> 1
一开始想着动态规划,做了一会没做出来,后来索性用递归了,居然ac了,看来这道题给的时间还蛮多的。
需要注意的是,n可能等于INT_MAX,所以写一个新的函数,用long类型的变量,这样就可以处理n等于INT_MAX时的特殊情况了,因为此时即使n+1,也不会溢出,代码如下:
class Solution {
public:
int integerReplacement(int n) {
return get_res(n);
}
int get_res(long n)
{
if(n == 1)
return 0;
else if(n%2 == 0)
return get_res(n/2)+1;
else
return min(get_res(n+1),get_res(n-1))+1;
}
};