【贪心+位运算】整数替换

【贪心+位运算】整数替换_第1张图片


/**
 * 思路:贪心+位运算
 *       对于偶数使用右移运算符实现除以2然后统计次数即可。
 *       对于奇数需要考虑是加一和减一哪个需要的次数更少:
 *       将数化为二进制,而将数最后化为 1.就是尽可能减少二进制中的 1 。
 *       注意:奇数二进制最低位全是 1,偶数最低位全是 0
 *
 *       如果低位和次低位都是 1,加上 1 会连续消去多个二进制中的 1,
 *       然后在前面补一位 1,在最低位到补的这一个 1 之间都是 0,
 *       可以直接通过不断右移得到。而如果在这种情况下 -1,
 *       之后每右移 1 位后都会遇到这些连续的 1,
 *       这样每右移一位后都会比之前多一步减 1 的操作。
 *       次低位是 0,就减去 1
 *       唯一特例:3。只有 3 的时候,是直接 -1 最优。
 *
 * @auther start
 * @create 2024-01-11 10:27
 */

    //贪心:位运算:尽可能去掉1,奇数最后一位都是1,偶数最后一位都是0
    public int integerReplacement(int _n) {
        long n = _n;
        int ans = 0;
        while (n != 1) {
            //偶数情况连续除以2
            if (n % 2 == 0) {
                n >>= 1;
            } else { //奇数情况判断次低位是否为1,并且不为3直接加一。
                if (n != 3 && ((n >> 1) & 1) == 1) n++;
                else n--;
            }
            ans++;
        }
        return ans;
    }

你可能感兴趣的:(刷题笔记,算法,数据结构)