0%

397. 整数替换

397. 整数替换

记忆化搜索

如果替换成vector,vector需要n的空间,不行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public:
int integerReplacement(int n) {
if(n == 1)
return 0;
if(memo[n])
return memo[n];
int tmp;
if(n & 1)
tmp = min(integerReplacement(n / 2), integerReplacement(n / 2 + 1)) + 2; // 重点,看解释
else
tmp = integerReplacement(n / 2) + 1;
memo[n] = tmp;
return tmp;
}
private:
unordered_map<int, int> memo;
};

时间复杂度:O(logn) 空间复杂度: O(logn)

原因在于这里每一步都会将原数/2

上述重点语句。对于n为奇数来说,n-1和n+1都必然会带来一个偶数,如果是偶数就不是1而且只能除以2,所以把这个操作合并为一次完成就是(n-1)/2或(n+1)/2。

但是考虑到溢出的问题,由于(n-1)/2就是n/2向下取整,而(n+1)/2就是n/2向上取整,因此他们可以表示为n/2和n/2+1。

dp超内存,空间复杂度是O(N)