Medium

Integer ReplacementC++

Full explanation · Time O(n) · Space O(1)

// Time:  O(logn)
// Space: O(1)

// Iterative solution.
class Solution {
public:
    int integerReplacement(int n) {
        if (n == 2147483647) {
            return 2 + integerReplacement(n / 2 + 1);
        }

        int result = 0;
        while (n != 1) {
            const auto b = n & 3;
            if (n == 3) {
                --n;
            } else if (b == 3) {
                ++n;
            } else if (b == 1) {
                --n;
            } else {
                n /= 2;
            }
            ++result;
        }
        return result;
    }
};

// Time:  O(logn)
// Space: O(logn)
// Recursive solution
class Solution2 {
public:
    int integerReplacement(int n) {
        if (n == 2147483647) {
            return 2 + integerReplacement(n / 2 + 1);
        }

        if (n < 4) {
            switch (n % 4) {
                case 0: case 1: return 0;
                case 2: return 1;
                case 3: return 2;
            }
        }

        switch (n % 4) {
            case 0: case 2: return integerReplacement(n / 2) + 1;
            case 1: return integerReplacement((n - 1) / 4) + 3;
            case 3: return integerReplacement((n + 1) / 4) + 3;
        }
        return 0;
    }
};