leetcode第397题-整数替换
目录
1.归算法参考:递归算法讲解_LightOn-CSDN博客_递归算法
题目:
给定一个正整数 n ,你可以做如下操作:
如果 n 是偶数,则用 n / 2替换 n 。
如果 n 是奇数,则可以用 n + 1或n - 1替换 n 。
n 变为 1 所需的最小替换次数是多少?
解决思路:
1.枚举
从题目自身出发,定义一个函数,传入参数n,进行循环,判断其奇偶数,进行除2或者+1,-1操作,定义计时器便可。
循环源码:
class Solution1{
private:
int count=0;
public:
int integerReplacement(int n) {//循环或者递归均可
int temp;
while(n>1)//判断是否大于1
{
if(n%2==0)//如果整除2,则n=n/2,计数器+1
{
temp=n/2;
count++;
}
else//如果不整除2,则令n--;计数器+1
{
temp=n-1;
count++;
}
n=temp;
}
return count;
}
};
2.记忆化搜索递归(动态规划)
创建一个记忆数组,在每一次递归时都首先检查存取整数n的记忆数组是否已经存在,若已存在则直接返回,不需要再进行递归下去。此时时间复杂度大大将达。
记忆化搜索源码:
class Solution2 {//类的方法,定义递归函数,该方法类似与动态规划。
private:
unordered_map<int, int> memory;//定义容器数组
public:
int integerReplacement(int n) {//定义函数
if (n == 1) {
return 0;//如果n==1,返回的计数为0
}
if (memory.count(n)) {//如果数组的计数已存在,则直接返回。
return memory[n];
}
if (n % 2 == 0) {//如果整除2,则计数改数组的数组进行递归。
return memory[n] = 1 + integerReplacement(n / 2);
}
return memory[n] = 2 + min(integerReplacement(n / 2), integerReplacement(n / 2 + 1));
}
};