Leetcode 397. Integer Replacement

本文深入解析LeetCode题目397 Integer Replacement的解决方案,采用深度优先搜索和广度优先搜索两种方法,详细阐述了如何通过判断数字的奇偶性,使用位运算技巧来寻找将任意正整数转换为1所需的最少步骤。代码示例清晰地展示了非递归实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值