Leetcode 397. Integer Replacement

题目描述:判断一个数字到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)

你可能感兴趣的:(算法,LeetCode,栈)