【最优解】【打卡90天】leetCode每日一题:397. 整数替换

1、题目描述

给定一个正整数 n ,你可以做如下操作:

如果 n 是偶数,则用 n / 2替换 n 。
如果 n 是奇数,则可以用 n + 1或n - 1替换 n 。
n 变为 1 所需的最小替换次数是多少?

2、算法分析

 因为题目中给的范围是:

  • 1 <= n <= 2^31 - 1,所以使用long类型。

给定一个正整数 n ,你可以做如下操作:

  1. 如果 n 是偶数,则用 n / 2替换 n 
  2. 如果 n 是奇数,则可以用 n + 1n - 1替换 n 。

注意n为奇数:

主要处理n是奇数的情况,n != 1。题目中说最少题目次数是多少。所以n是奇数的时候,默认n-1。

定义中间值,temp = n-1。因为奇数n有n-1 和n+1 两种情况。但是注意,比如7,(7-1)/2 = 3为奇数,奇数还是需要判断,(7+1)/2=4,4是偶数,所以直接除以2就可以。那我们就应该选择除以我是偶数的情况。

偶数的话直接判断就可以。

3、代码实现

class Solution {
    public int integerReplacement(int m) {
        long n = (long)m;
        int count = 0;
        while(n != 1){
            // n为奇数的时候
            if(n % 2 == 1){
                long temp = n - 1;
                /*
                    判断奇数经过n-1和n+1后/2是否为整数
                    5-1 = 4 4/2 = 2
                    5+1 = 6 6/2 = 3
                */
                if((temp/2) % 2 == 1 && temp/2 != 1){
                    //  5+1=6,变成偶数
                    n += 1;
                }else{
                    // n = n-1
                    n = temp;
                }
                // n为偶数的情况
            }else{
                n = n/2;
            }
            // 计数
            count++;
        }
        return count;
    }
}

猜你喜欢

转载自blog.csdn.net/Sunshineoe/article/details/121431129
今日推荐