题目大意
给定一个正整数 n,你可以做如下操作:
- 如果 n 是偶数,则用 n / 2替换 n。
- 如果 n 是奇数,则可以用 n + 1或n - 1替换 n。
n 变为 1 所需的最小替换次数是多少?
示例 1:
输入:
8
输出:
3
示例 2:
输入:
7
输出:
4
解题思路
如果当前数字是偶数,/2。如果当前数字是奇数,可以+1,也可以-1.
方法一:
动态规划(超时)。状态转移方程分奇偶:
- 奇数:dp[i] = min(dp[(i - 1) / 2], dp[(i + 1) / 2]) + 2;(因为是从前往后推的,dp[i]的时候还没计算dp[i+1],但我们知道i+1是个偶数,所以只要知道(i + 1) / 2的值,然后+2即可)
- 偶数:dp[i] = dp[i / 2] + 1;
class Solution {
public:
int integerReplacement(int n) {
if(n == 1)
return 0;
vector<int> dp(n + 1, 0);
for