397. Integer Replacement 题解

397. Integer Replacement 题解


题目描述:

Given a positive integer n and you can do operations as follow:

  1. If n is even, replace n with n/2.
  2. If n is odd, you can replace n with either n + 1 or n - 1.

What is the minimum number of replacements needed for n to become 1?

Example 1:

Input:
8

Output:
3

Explanation:
8 -> 4 -> 2 -> 1

Example 2:

Input:
7

Output:
4

Explanation:
7 -> 8 -> 4 -> 2 -> 1
or
7 -> 6 -> 3 -> 2 -> 1

题目链接:397. Integer Replacement



算法描述:


          由题意知,给定一个整数 n 我们将对它进行“调整”,当为偶数时,n=n/2,当为奇数时,n=n+1 或 n=n-1(奇数调整为偶数),……当这个数调整为 1 时停止,我们记录调整的次数并返回最小的调整次数。

      

      题目的要求是取调整的最小次数,因为当 n 为偶数时,只需要进行 n/2 运算,但是当 n 为奇数时,我们需要判断到底是对 n 加一,还是对 n 减一。我们发现,能让 n 尽快变为 1 的条件是尾数上的 0 相比较越多越好。所以,我们需要判断 n+1后面的 0 多,还是 n-1 后面的 0 多,选取多的为调整的数。 最后需要注意当 n=3 时的情况。

      

代码:

class Solution {
public:
    int integerReplacement(int n) {
        int ans=0;
        if(n==INT_MAX){
            return 32;
        }
        while(n!=1){
            if((n & 1)==0){
                n=n>>1;
                ans++;
            }
            else{
                if(n==3){
                    n=2;
                    ans++;
                }
                else{
                    if(countTail0(n+1)>countTail0(n-1)){
                        n=n+1;
                        ans++;
                    }
                    else{
                        n=n-1;
                        ans++;
                    }
                }
            }
        }
        return ans;
    }
    
    int countTail0(int m){
        int count0=0;
        while((m & 1)==0){
            m=m>>1;
            count0++;
        }
        return count0;
    }
    
};





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值