【问题标题】:algorithmic: the minimum number of operations form M to N with only three operations算法:从 M 到 N 的最小操作数,只有三个操作
【发布时间】:2020-06-12 09:57:03
【问题描述】:

给定两个正数M和N,现在只能对M做以下三种操作之一: 加 1,减 1,或乘以 2。

  • 双倍:乘以 2。
  • 递减:减 1。
  • 增量:加 1。

每次你可以选择三个操作中的任何一个。

输入:M = 2,N = 3 输出:1 (2 + 1)

输入:M = 2,N = 5 输出:2(2 * 2, + 1)

返回显示数字 Y 所需的最少操作次数。

这里可以使用BFS,但是它的时间复杂度很高,可能是O(2^n)。 至于更简单的问题,leetcode991 使用贪心算法。任何人都可以提供类似的。

【问题讨论】:

  • 这是从 leetcode991: 坏计算器改过来的
  • 我没有得到步骤。你能逐行提及它们吗?
  • @vivek_23 以输入:M = 2, N = 5 为例。将 M 乘以 2,然后得到 4,将 4 乘以 1,得到 5。因此只需根据需要执行 2 步。我说清楚了吗?
  • 我指的不是过程,而是问题陈述本身。 Double: 乘以 2 是什么意思?格式不清楚。可以逐点添加吗?

标签: arrays algorithm


【解决方案1】:

在每个步骤中,您都有一个数字。反过来把它想象成从 N 到 M 的旅行。在位置 x 计算以下内容:

1. abs(x-M)
2. for even x, 1 + abs(x/2-M)
3. for odd x, 2 + abs((x+1)/2-M)
4. for odd x, 2 + abs((x-1)/2-M)

选择结果最小的选项,记下操作,然后重复。如果您选择了第一个选项,请停止。

例如,M=17,N=39

x=39, the (1,2,3,4) tuple is (22, n/a, 4, 3), so we choose the fourth option.
x=19, we have (2, n/a, 8, 9), so we choose the first option 

现在我们将这些反过来得到:17+1+1 = 19; 19*2+1 = 39

这需要记录时间。

【讨论】:

  • 多么漂亮的解决方案。至于步骤,如果是第一次操作,加上abs(x-M);如果取第二个,x = x // 2,然后加 1;如果取第三个,x = (x + 1) // 2,然后加 2;如果取第三个,x = (x - 1) // 2,然后加 2。但我不熟悉如何证明这一点。你能解释一下这四个操作吗?
  • 在每一步中,我们都在回答这个问题:“是递增到达目标的方式,还是(反过来)除以 2 更好?”这里,(1) 反映了递增选项,(2) 到 (4) 是除以 2 的 3 种方式(因为您可能需要先递增或递减 1)。
  • 是的,我明白了。这是如何使用贪心算法的一个很好的例子。 THX
猜你喜欢
  • 1970-01-01
  • 2011-05-31
  • 2018-12-29
  • 1970-01-01
  • 2018-09-10
  • 2021-07-28
  • 2016-09-07
  • 1970-01-01
  • 2023-03-11
相关资源
最近更新 更多