leetcode 397. 整数替换 [java / dfs / 位运算贪心]

81 阅读1分钟

题目

给定一个正整数 n ,你可以做如下操作: 如果 n 是偶数,则用 n / 2替换 n 。 如果 n 是奇数,则可以用 n + 1或n - 1替换 n 。 n 变为 1 所需的最小替换次数是多少?

题目链接

397. 整数替换

思路dfs

当时偶数时候 直接 +1次 当时奇数时候,n + 1 和 n - 1的次数 最小的 + 2 此

代码

 public  int f2(int n){
        if(n == 1){
            return 0;
        }
//        偶数一次
        if (n % 2 == 0){
            return 1 + f2(n / 2);
        }
//        奇数 + 2次
        return 2 + Math.min(f2(n/2),f2(n/2+1));
    }

思路 位运算动态规划

假设n 为奇数7的二进制 111 当7 + 1 = 8的二进制为 1000 一共4此即可变为1 如果是偶数 直接右移 1 当是 3的时候要做特殊处理 3-1 到1 只需要2次,3+1需要3次

代码

public  int f(long n){
        int ans = 0;
        while(n != 1){
//          偶数 1110 右移一位 111 就是除2
            if (n % 2 == 0){
                n >>= 1;
            }else {
//                111 >> 1位 11 & 1  等于0 表示第二位是0,等于1表示第二位是1 + 1等消除多个二进制1的话就要+1
                if (n != 3 && ((n >> 1) & 1) == 1)
                    n++;
                else
                    n--;
            }
            ans++;
        }
        return ans;
    }