Python每日一练算法之整数替换(DFS)

问题描述:

给定一个正整数n,如果n为偶数,将n替换为n/2;如果n为奇数,将n替换为n+1或n-1,那么将n转换为1,最少的替换次数为多少?

问题示例:

输入8,输出3,即8->4->2->1;输入7,输出4,即7->8->4->2->1,或者7->6->3->2->1

代码实现:

解题思路其实就相当于因式分解,采用DFS算法

class IntegerReplace:
   
   def integerreplace(self,n):
      memo ={}
      self.dfs(n,memo)
      print(memo[n])
      return len(memo[n])-1

   def dfs(self,n,memo):
      temp = []
      if n in memo:
         return memo[n]
      if n  ==1:
         temp.append(1)
         memo[1] = temp
         return temp
      if n  % 2 ==0:
         temp.append(n)
         cur = self.dfs(n//2,memo)
         temp.extend(cur)
         memo[n] = temp
         return temp
      else:
         temp2 = temp.copy()
         n2 = n
         temp.append(n)
         cur = self.dfs((n+1),memo)
         temp.extend(cur)
         temp2.append(n2)
         curs = self.dfs((n2-1),memo)
         temp2.extend(cur2)
         if len(temp) < len(temp2):
            memo[n] = temp
            return temp
         else:
            memo[n] = temp2
            return temp2

if __name__ == '__main__':
   slo = IntegerReplace()
   n = int(input("请输入一个数字:"))
   res = slo.integerreplace(n)
   print(res)

结果输出:

'''
请输入一个数字:8
[8, 4, 2, 1]
3

请输入一个数字:89
[89, 88, 44, 22, 11, 10, 5, 4, 2, 1]
9
'''

有兴趣的朋友可以提升一下难道,把所有最小的替换过程打印输出_

猜你喜欢

转载自blog.csdn.net/qq_42642142/article/details/105994486