一开始想用dp[],但是爆内存了
后面改成递归,AC了
class Solution:
def __init__(self):
self.d = dict()
self.d[1] = 0
self.d[2] = 1
def integerReplacement(self, n: int) -> int:
if n in self.d:
return self.d[n]
else:
if n % 2 == 0:
return self.integerReplacement(n//2) + 1
else:
L,R = self.integerReplacement(n-1), self.integerReplacement(n+1)
return min(L,R) + 1
按照题意描述就能写出上面的代码
还有一种位运算的技巧
class Solution {
public int integerReplacement(int _n) {
long n = _n;
int ans = 0;
while (n != 1) {
if (n % 2 == 0) {
n >>= 1;
} else {
if (n != 3 && ((n >> 1) & 1) == 1) n++;
else n--;
}
ans++;
}
return ans;
}
}
来源:https://leetcode-cn.com/problems/integer-replacement/solution/gong-shui-san-xie-yi-ti-san-jie-dfsbfs-t-373h/
主要是考虑到n为奇数的情况,此时n的最后一位必为1
考虑两种情况:
- n的次低位(倒数第二位)为1,则考虑+1,因为该操作能够消去一段连续的1
- n的次低位为0,考虑-1,因为+1位数里面的1的个数不会变化,但是-1能够消去一个1
再考虑一个特殊情况:3,此时应该-1
版权声明:本文为hhmy77原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。