给定一个正整数 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
思路:这道题用递归来做,边界条件:当n等于0,返回0。否则当n为偶数时,返回1+递归(n/2),当n为奇数,返回1+min(递归(n+1)和递归(n-1))的最小值,但是这样对于最大值INT_MAX会报错,那么我们换种想法,当n为奇数时,反正n+1或者n-1都是偶数,下一步也是返回1+递归(n/2),那么我们不如直接跳两步,刚好可以解决最大数的问题,所以当n为奇数时,返回2+min(递归((n+1)/2),递归((n-1)/2))。
参考代码:
class Solution {
public:
int integerReplacement(int n) {
if (n == 1) return 0;
else if ((n & 1) == 0) return (1 + integerReplacement(n >> 1));
else {
long long t = n;
return 2 + min(integerReplacement((t + 1)>>1), integerReplacement((t - 1)>>1));
}
}
};