397. 整数替换
描述
给定一个正整数 n ,你可以做如下操作: 如果 n 是偶数,则用 n / 2替换 n 。 如果 n 是奇数,则可以用 n + 1或n - 1替换 n 。 n 变为 1 所需的最小替换次数是多少?
分析
看到这道题,第一个想法居然是动态规划的跳台阶的思路(没去验证是否行得通) 深度搜索优先解法 求n的最小替换次数,可以通过n/2或者n-1,n+1得到,如此递归下去,直到n等于1。 利用hashmap可以减少重复计算 看题解,推荐使用位运算,但是没能理解位运算的做法为什么是正确的。
class Solution {
Map<Long,Integer> map = new HashMap<>();
public int integerReplacement(int n){
return dfs(n*1L);
}
public int dfs(long n){
if(n == 1){
return 0;
}
if(map.containsKey(n)){
return map.get(n);
}
int count = 0;
if(n % 2 == 0){
count += dfs(n/2);
}else{
count +=Math.min(dfs(n+1),dfs(n-1));
}
map.put(n,++count);
return count;
}
}
|