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
解析:
可以使用深度优先搜索:
递归出口:n==1,返回值为0
递归过程:
1, n为偶数,直接递归下一项 n/2,步数+1
2,n为奇数,递归下一项 n+1,n-1,步数+1,取两者最小值
然后用记忆化优化,可以使用map,用int开的空间过大,会有很多用不到的空间。
code:
class Solution {
public:
unordered_map<int,int> ma;
int dfs(long n){
if(ma.find(n)!=ma.end())
return ma[n];
int ans;
if(n==1){
ma[n]=0;
return 0;
}
if(n%2==0){
int tmp=dfs(n/2)+1;
ma[n]= tmp;
return ma[n];
}
else if(n%2!=0){
int tmp=min(dfs(n-1),dfs(n+1))+1;
ma[n]=tmp;
return ma[n];
}
return ma[n];
}
int integerReplacement(int n) {
return dfs(n);
}
};
题目来源: leetcode 397.整数替换