Leetcode 397 - Integer Replacement(Math)

23 篇文章 0 订阅

题意

给一个数n,对其操作使用最少的步数将n变成1。

操作:

  1. n为偶数,n / 2
  2. n为奇数,可以n + 1或者n - 1

思路

我们贪心的去考虑,当n比较大的时候,我们将n减小一半一定比n - 1要优。怎么尽量维持更多的减半操作呢?

  1. 当n是偶数的时候,一定是n / 2。

  2. 当n为奇数的时候,假设我们 n=2k+1

    1. n+1 后减半: n=((2k+1)+1)/2=k+1
    2. n1 后减半: n=((2k+1)1)/2=k

    如果要使下一次也尽量能够减半的话,即对n操作后的数应该为偶数。

    所以,当 k 为奇数时,k+1为偶数,我们选择 n+1

    k 为偶数时,我们选择n1

这是在n比较大的情况下,减半一定比减1更优,当我们n接近于1的时候,不一定是这样。

我们计算可知:当n == 3的时候,我们应该选择 n1

代码

class Solution {
public:
    int integerReplacement(long long n) {
        int s = 0;
        while (n != 1) {
            if (n & 1) {
                if (n == 3) n--;
                else {
                    int k = n / 2;
                    if (k & 1) n++;
                    else n--;    
                }
            } else {
                n >>= 1;
            }
            s++;
        }
        return s;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值