【问题标题】:given a number, find the minimum of all numbers formed by replacing any 2 consecutive digits with the higher of the 2给定一个数字,找出通过将任意 2 个连续数字替换为 2 个中较大的数字而形成的所有数字中的最小值
【发布时间】:2023-04-06 06:26:01
【问题描述】:

例如:如果 N = 8729,则编号为 829、879、879。最小编号为 829。

蛮力是通过删除连续对的低位数字来找到所有数字中的最小值。时间复杂度为 O(n)。有没有更好的方法来思考这个问题?

【问题讨论】:

  • 我不想改变你的问题的意图,但听起来你想将你的标题改写为“给定一个数字 N,找到通过替换生成的数字集中的最小数字N 中的任意两个连续数字,两者中的较高者"。
  • 通过删除与较大数字相邻的任何数字将形成等效集合。我认为这样考虑更容易,因为您无需查看每一对连续数字,而是查看一个数字并将其与一个或两个相邻数字进行比较。这样您就可以按顺序进行并跳过重复项(例如 879 879)。
  • 你如何处理相等的连续数字?对于889,生成集是[88, 89] 还是只是[89]

标签: algorithm math


【解决方案1】:

蛮力是通过删除连续对的低位数字来找到所有数字中的最小值。时间复杂度为 O(n)。

O(n) 的确切含义令人非常困惑。

n 是什么?它与您的示例中的N 有什么关系(N = 8729)?您的意思是枚举所有可能选项并选择最小值的算法具有O(N) 运行时复杂度?

如果是这样,那么我认为你可能错了。运行时复杂度为O(log(N))(空间复杂度相同)。原因是所有可能选项的个数等于N的位数,大约等于N的log10。

我认为没有比这更好的了。一些修剪可能会提高平均案例复杂度,但最坏的情况始终是O(log(N))

【讨论】:

    【解决方案2】:

    我不相信你可以改进 O(N),其中 N 是数字中的位数。但是,我相信您可以改善计算成本,因为“最小”一词意味着从左到右的顺序。

    考虑一个由 ABC... 表示的数字,其中“...”表示任意数量的附加数字。

    如果 A>B,那么所有可能的解决方案都必须以 A 开头。 这可以在您的示例中看到,其中所有可能的解决方案都以 8 开头。 如果 A

    所以,我们知道第一个数字总是代表答案中的第一个数字!

    更进一步,如果 A

    但是,如果 A>B,则 B 在最小解中是可选的,允许选择 - 如果 B>C,则最小解必须是 AC...,通过替换 AB=>A,因为 AB...将始终大于 AC...,只要在任何子解决方案上满足此条件,就会缩短解决方案。

    请注意,由于完全升序的最坏情况,这仍然是 O(N),但可能会消除一些单独的步骤,我认为这是可以做到的最好的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-24
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-03
      • 2015-12-09
      相关资源
      最近更新 更多