LeetCode397-整数替换

题目链接

英文链接:https://leetcode.com/problems/integer-replacement/

中文链接:https://leetcode-cn.com/problems/integer-replacement/

题目详述

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

  1. 如果 n 是偶数,则用 n / 2替换 n

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

    n 变为 1 所需的最小替换次数是多少?

示例 1:

1
2
3
4
5
6
7
8
输入:
8

输出:
3

解释:
8 -> 4 -> 2 -> 1

示例 2:

1
2
3
4
5
6
7
8
9
10
输入:
7

输出:
4

解释:
7 -> 8 -> 4 -> 2 -> 1

7 -> 6 -> 3 -> 2 -> 1

题目详解

  • 奇数的计算方法已经固定了。
  • 偶数有两种计算方法。通过观察模拟发现,当 n 的 最后的两个二进制位为 0b11 时,采用加一操作更好,否则采用减一操作更好。但是有一个例外,当 n 恰好等于 0b11 时,采取减一操作更好。
  • 注意 n == Integer.MAX_VALUE 的情况,应该采用无符号移位 >>> 操作。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class LeetCode_00397 {

public int integerReplacement(int n) {
int res = 0;
while (n != 1) {
if ((n & 1) == 0) {
n >>>= 1;
} else if (n != 3 && (n & 3) == 3) {
++n;
} else {
--n;
}
++res;
}
return res;
}
}