题目链接:https://leetcode.com/problems/integer-replacement/
Given a positive integer n and you can do operations as follow:
- If n is even, replace n with
n/2
. - If n is odd, you can replace n with either
n + 1
orn - 1
.
What is the minimum number of replacements needed for n to become 1?
Example 1:
Input: 8 Output: 3 Explanation: 8 -> 4 -> 2 -> 1
Example 2:
Input: 7 Output: 4 Explanation: 7 -> 8 -> 4 -> 2 -> 1 or 7 -> 6 -> 3 -> 2 -> 1
方法一:
class Solution{
public:
int integerReplacement(int n)
{
return getOne(n);
}
int getOne(int n)
{
if(n==INT32_MAX)
return 32;
else if(n==1)
return 0;
else if(n%2==0)
return getOne(n/2)+1;
else if(n%2!=0)
return min(getOne(n+1),getOne(n-1))+1;
return 0;
}
};
方法二:
思路:
All you need is determine replace n
with n
+ 1
or n - 1
, when n is odd. since,
- if n is even, you get no choice, just replace it with
n / 2
. - if n is odd, you can either
add 1
orreduce 1
.
If n + 1 % 4 == 0
, replace n
with n
+ 1
will short the path. Otherwise, replace n
with n
- 1
is always the right direction.
class Solution {
public:
int integerReplacement(int n)
{
if (n == 1)
return res;
if (n == 3)
{
res += 2;
return res;
}
if (n == INT32_MAX)
return 32;
res ++;
if (n & 1)
if ((n + 1) % 4 == 0)
integerReplacement(n + 1);
else
integerReplacement(n - 1);
else
integerReplacement(n / 2);
return res;
}
private:
int res = 0;
};