声明:只求用最简单的方法通过,不求优化,不喜勿喷
- 使用记忆化搜索+递归来做
- 根据题目意思,如果是偶数那么直接/2,总操作次数+1
- 如果是奇数,那么总操作次数是 n+1 和 n-1 中更小的一个
- 所以先一直除2直到不能除为止,然后加上递归算的 n+1 和 n-1 中更小的一个即可
- 发现在运算过程中有很多的重复运算,所以开一个obj来存储已经算过的值,如果算过直接返回即可,不需要递归,加速运算时间
- 优化todo
/**
* @param {number} n
* @return {number}
*/
let obj = {};
var integerReplacement = function (n) {
let sum = 0;
if (typeof obj[n] != 'undefined') {
return obj[n]
}
while (n % 2 == 0) {
sum++;
n = n / 2;
}
if (n != 1) {
sum++;
obj[n - 1] = integerReplacement(n - 1);
obj[n + 1] = integerReplacement(n + 1);
sum += Math.min(obj[n - 1], obj[n + 1])
}
return sum;
};