版权声明:Za七杂⑧ https://blog.csdn.net/weixin_35085773/article/details/86578179
题目描述:判断一个数字到1需要多少个步骤?
题目链接:Leetcode 397. Integer Replacement
其变换描述为:如果n是偶数,其n/2,如果是奇数,可以加1或者减1,找出最小变化步数。
思路:深度优先搜索加上剪枝,判断奇数偶数用n&1 看位数,除以2用移位的方法。
着重介绍下广度优先搜索,利用visited
集合记录已经遍历的结果,然后再利用一个队列进行搜索,这样可以保证最小,跟图的遍历非常相似,一个判断去重的结果,以及终止条件。当然也可以全部遍历完找最小的,不冲突。
非递归的方式:
class Solution(object):
def integerReplacement(self, n):
"""
:type n: int
:rtype: int
"""
visited = set([n])
queue = [(n,0)]
while(queue):
num,move = queue.pop(0)
if num==1:
return move
if (num&1)==0: #even
num >>= 1
if num not in visited:
visited.add(num)
queue.append((num,move+1))
else: #odd
for n in [num-1,num+1]:
if n not in visited:
visited.add(n)
queue.append((n,move+1))
代码如下:
class Solution(object):
def integerReplacement(self, n):
"""
:type n: int
:rtype: int
"""
self.mn = (1<<31) - 1
self.dfs(n,0)
return self.mn - 1
def dfs(self,n,s):
if s>self.mn:
return
if n==0:
self.mn = min(self.mn,s)
return
if (n&1)==0:
self.dfs(n>>1,s+1)
else:
self.dfs(n-1,s+1)
self.dfs(n+1,s+1)