题目描述
给定一个正整数 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
算法1
目前就是 暴力dfs。
其实可以反过来想,1经过加倍和加1减1 如何经过最小操作得到指定数字
暴力代码如下
C++ 代码
class Solution {
public:
int dfs(long long n )
{
if(n==1) return 0;
if(n%2 == 0){
cout << 0 << endl;
return dfs(n>>1)+1;
}else{
cout << 1<< endl;
//单数
int ret = min(dfs(n+1),dfs(n-1));
return ret+1;
}
}
int integerReplacement(int n) {
return dfs(n);
}
};
算法2
添加哈希 做了记忆化 加速效果明显
C++ 代码
class Solution {
public:
unordered_map<long long , int> memo;
int dfs(long long n )
{
if (memo.count(n)) return memo[n];
if(n==1) return 0;
if(n%2 == 0){
int ret = dfs(n>>1);
memo[n] = ret+1;
return ret+1;
}else{
//单数
int ret = min(dfs(n+1),dfs(n-1));
memo[n] = ret+1;
return ret+1;
}
}
int integerReplacement(int n) {
int res = dfs(n);
memo[n] = res;
return res;
}
};