Leetcode算法心得——将整数减少到零需要的最少次数

大家好,我是晴天学长,今天的算法题思想用到了位运算中两个常考的点,一个是按位与&的n&-n和n&n-1,一个是位运算中的<< ,题目不难,但是知识的思路的运用还是值得学习的,需要的小伙伴请自取哦!💪💪💪


1 )将整数减少到零需要的最少次数

在这里插入图片描述

在这里插入图片描述

2) .算法思路

  • 把 n看成二进制数,那么更高位的比特 11 是会受到更低位的比特 11 的加减影响的,但是,最小的比特 11 没有这个约束。
  • 那么考虑优先消除最小的比特 11,设它对应的数字为 lowbit。(lowbit是n最低位的1)
  • 消除方法只能是加上 lowbit,或者减去 lowbit。
  • 贪心的策略是:如果有多个连续 11,那么采用加法是更优的,可以一次消除多个 11;否则对于单个 11,减法更优。

3).代码示例

 static class Solution {
        public static int minOperations(int n) {
            int sum = 1;
            while ((n & (n - 1)) > 0) { // n 不是 2 的幂次
                int lb = n & -n;
                if ((n & (lb << 1)) > 0) n += lb; //lb是正数n二进制的最后一个1,其他位都是0,<< 1 左移一位,如果是1的话,会>0,如果是0的话,就会等于0.
                else n -= lb; // 单个 1
                ++sum;
            }
            return sum;
        }
    }

4 ) . 总结

  • n=n&(n-1)是把二进制的最后一个1变成0.
  • lb=n& -n取到二进制最后一个1,比如10: 0000 1010 lb=0000 0010
  • << = 1 二进制中的1所有都往左移动1位,依次类推。

LeetCode试题

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晴天学长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值