1. 解析
题目大意, 输入一个正整数,按照一定的步骤将其缩小为1,如果当前为偶数,则折半;如果当前的奇数,将其加1或者减1,求解缩小为1所经过的最少步骤。
2. 分析
如果当前数为偶数,折半即可,若为奇数,可以做两种不同的操作,要么减1要么加1;很明显我们要一直往下搜索目标,由于还存在不同的选择,故需要回溯到之前的状态,用深搜DFS无非是最合适的。如果n = INT_MAX,则n+1会超出整形的表示范围,所以我们单独进行处理即可。按照上面的操作还是比较容易写出对应的DFS表达式的,详见代码。
class Solution {
public:
int integerReplacement(int n) {
if (n == 1) return 0;
if (n % 2 == 0){ //偶数
return integerReplacement(n/2) + 1;
}
else{ //奇数
if (n == INT_MAX) //为了防止n+1超出整形的表示范围,单独处理,也可以先转换成long型
return integerReplacement(n/2-1) + 1;
return min(integerReplacement(n+1) + 1, integerReplacement(n-1) + 1);
}
}
};