题目描述:
给定一个正整数 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
思路:
刚开始看到这道题,是这样想的:当n为偶数的时候n=n/2,当n为奇数的时候n=n-1,这样是否就是最小替换次数呢?当然不是这样的,比如说n初始值为65535,以上述想法得到的结果是30次,正确的结果是17次。所以否定掉上述的想法,直接用递归的方式,当遇到奇数的时候要考虑用 n + 1替换 n和n - 1替换n这两条路。递归结束条件为n==1。
JavaScript:
/**
* @param {number} n
* @return {number}
*/
var integerReplacement = function(n) {
var minLen=n;
function getLen(m,len)
{
if(m==1)
{
if(minLen>len)
minLen=len;
return;
}
else if((m&1)==0)
{
getLen(m/2,len+1);
}
else
{
getLen(m+1,len+1);
getLen(m-1,len+1);
}
}
getLen(n,0);
return minLen;
};