397. 整数替换
给定一个正整数 n
,你可以做如下操作:
- 如果
n
是偶数,则用n / 2
替换n
。 - 如果
n
是奇数,则可以用n + 1
或n - 1
替换n
。
返回 n
变为 1
所需的 最小替换次数 。
示例 1:
输入:n = 8 输出:3 解释:8 -> 4 -> 2 -> 1
示例 2:
输入:n = 7 输出:4 解释:7 -> 8 -> 4 -> 2 -> 1 或 7 -> 6 -> 3 -> 2 -> 1
示例 3:
输入:n = 4 输出:2
提示:
1 <= n <= 231 - 1
解题思路:这题和之前碰到一题非常类似,那道题也是用到了动态规划加递归的方式,所以这题也是尝试用同样的方法去破题。
但这里比较麻烦的时如果是奇数你将面临2种解题途径,要么N+1,要么N-1,因为返回的是最小的将n化为1的处理次数,所以我们这里用一个min函数来对这两个方法进行选择即可。
class Solution {
private:
unordered_map<int, int> memo;
public:
int integerReplacement(int n) {
if (n == 1) {
return 0;
}
if (memo.count(n)) {
return memo[n];
}
if(n&1)
{
return memo[n] = 2 + min(integerReplacement(n / 2), integerReplacement(n / 2 + 1));
}
else return memo[n] = 1 + integerReplacement(n / 2);
}
};