例如:如果N = 8729,则数字为829,879,879。最小数字为829.
蛮力通过删除连续对的低位来找到所形成的所有数字的最小值。时间复杂度为O(n)。有没有更好的方式来考虑这个?
答案 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),但可能会消除一些单独的步骤,我相信这是最好的。