LeetCode-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
Solution:
public class Solution { public int integerReplacement(int n) { if (n<1) return -1; int steps = 0; while (n!=1){ if (n%2==0){ n /= 2; } else { // We have: steps(2x) <= steps(2x-1) && steps(2x) <= steps(2x+1),i.e., // for odd number, we go to (n-1) if (n-1)/2 is an even number. // IMPORTANT: the only exception is n=3, for which we should choose n-1,because (n-1)/2 is 1 directly. // NOTE: We need take care of n==Integer.MAX_VALUE, in which we cannot perform n+1. if (n==Integer.MAX_VALUE){ n = n/2+1; steps++; } else if (((n-1)/2)%2==0 || (n-1)/2==1){ n = n-1; } else { n = n+1; } } steps++; } return steps; } }