Integer Replacement

medium math greedy bit manipulation

Problem

Given a positive integer n, in one operation you may either replace n with n/2 (if even) or with n+1 / n−1 (if odd). Return the minimum number of operations to reach 1.

Inputn = 7
Output4
7 → 8 → 4 → 2 → 1. Picking +1 was better than −1 because it created a longer run of trailing zeros.

def integer_replacement(n):
    steps = 0
    while n != 1:
        if n % 2 == 0:
            n //= 2
        elif n == 3 or (n & 2) == 0:
            n -= 1
        else:
            n += 1
        steps += 1
    return steps
function integerReplacement(n) {
  let steps = 0;
  while (n !== 1) {
    if (n % 2 === 0) n = n / 2;
    else if (n === 3 || (n & 2) === 0) n -= 1;
    else n += 1;
    steps++;
  }
  return steps;
}
class Solution {
    public int integerReplacement(int n) {
        int steps = 0;
        long m = n;
        while (m != 1) {
            if ((m & 1) == 0) m /= 2;
            else if (m == 3 || (m & 2) == 0) m -= 1;
            else m += 1;
            steps++;
        }
        return steps;
    }
}
int integerReplacement(int n) {
    int steps = 0;
    long long m = n;
    while (m != 1) {
        if ((m & 1) == 0) m /= 2;
        else if (m == 3 || (m & 2) == 0) m -= 1;
        else m += 1;
        steps++;
    }
    return steps;
}
Time: O(log n) Space: O(1)