397. 整数替换

252 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

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

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

 

示例 1:

输入:n = 8 输出:3 解释:8 -> 4 -> 2 -> 1 示例 2:

输入:n = 7 输出:4 解释:7 -> 8 -> 4 -> 2 -> 1 或 7 -> 6 -> 3 -> 2 -> 1 示例 3:

输入:n = 4 输出:2  

提示:

1 <= n <= 231 - 1

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/in… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

主要思路如下:

当n为偶数,可以用n/2替换n。最后两位为xxxx10, 下一次处理 n = n/2 次数+1 当n为奇数,可以用n+1或者n-1替换n。n为奇数,代表n的最低bit位为1,此时衍生出两种选择: 用n-1替换n,本质上是清除掉n的最低bit位。 用n+1替换n,本质上是清除掉从n的最低比特位开始的连续非0bit,并将n的第一个0bit置为1。

唯一特例:3。只有 3 的时候,是直接 -1 最优。 3 → 2 → 1 优于 3 → 4 → 2 → 1。

另外注意当 n == INT_MAX 时,+1 会爆 int。

三、AC 代码:

​class Solution {
    public int integerReplacement(int n){
        if(n == 1)                  // 递归出口
            return 0;       
        if(n == Integer.MAX_VALUE)  // 防止2^31-1 在+1后溢出
            return 32;
          
        if((n & 1) == 1)    // n是奇数
            return Math.min(integerReplacement(n-1)+1,integerReplacement(n+1)+1);
        else
            return integerReplacement(n/2)+1;
    }
}

四、总结:

掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐