[LeetCode] 397. Integer Replacement
Given a positive integer n and you can do operations as follow:
- If n is even, replace n with
n/2
. - If n is odd, you can replace n with either
n + 1
orn - 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
题意:把一个数字变为1,执行过程有两种情况
如果它为偶数则直接除以2,否则 +1或者-1,要求变为1的步数最短
这题看到的时候,最先想到的就是递归求解了,思路不难,但是有坑,边界maxInt +1的时候直接爆,我们把这个点做特殊处理
递归写出来的时候就知道效率很差,a题后也只超越20%的人
仔细看其实有重复子问题,理论上来讲可以用dp解(但我没解出来,大家可以用这个思路试试)
1 class Solution { 2 3 public int integerReplacement(int n) { 4 if (n == 2147483647) 5 return 32; 6 else if (n == 1) 7 return 0; 8 else if (n%2 == 0) 9 return integerReplacement(n/2) + 1; 10 11 return min(integerReplacement(n - 1) + 1, integerReplacement(n + 1) + 1); 12 } 13 14 private int min(int a, int b) { 15 return a < b ? a : b; 16 } 17 }