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

该篇文章介绍了如何使用贪心策略和位运算技巧计算整数替换操作中1的最小次数。对于偶数,通过右移除以2;奇数则考虑次低位,非3时选择加一或减一以减少1的个数。
摘要由CSDN通过智能技术生成


/**
 * 思路:贪心+位运算
 *       对于偶数使用右移运算符实现除以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;
    }

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值