给定一个数字,找到用2中较高的2替换任意2个连续数字形成的所有数字的最小值

时间:2016-10-07 19:52:35

标签: algorithm math

例如:如果N = 8729,则数字为829,879,879。最小数字为829.

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

2 个答案:

答案 0 :(得分:0)

  

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

O(n)确切地说你的意思很混乱。

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

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

我认为你不能比这更好。一些修剪可能会改善平均案例复杂性,但最坏的情况总是O(log(N))

答案 1 :(得分:0)

我不相信你可以改进O(N),其中N是数字中的位数。但是,我相信你可以提高计算成本,因为术语"最小"意味着从左到右的排序。

考虑ABC代表的数字......其中" ..."表示任意数量的附加数字。

如果A> B,则所有可能的解决方案必须以A开头。     这可以在您的示例中看到,其中所有可能的解决方案都以8开头。   如果A <= B,那么可能的解决方案可以从A和B开始,但由于A较低,只有以A开头的那些可能符合最小标准。

因此,我们知道第一个数字将始终代表答案中的第一个数字!

更进一步,如果A <= B,则最小解决方案将始终是BC的解决方案...前缀为A.考虑7829,其中最小解789仅为829的解决方案的前缀。

但是,如果A> B,则B在最小解中是可选的,允许选择 - 如果B> C,则最小解必须是AC ...通过替换AB =&gt; A,因为AB .. 。总是比AC大......在任何子解决方案满足这个条件时立即缩短解决方案。

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