我正在解决下面的问题。
序列 [0, 1, ..., N] 已经打乱了,关于其顺序的唯一线索是一个表示每个数字是否大于或小于上一个数字的数组。给定此信息,重建与其一致的数组。
例如,给定 [None, +, +, -, +],您可以返回 [1, 2, 3, 0, 4]。
我浏览了这篇文章中的解决方案,但仍然无法理解该解决方案为何有效。如果我在面试时遇到这个问题,我认为我无法想出解决方案。谁能解释其背后的直觉?提前致谢!
这个答案试图给出一个通用策略来寻找解决此类问题的算法。它并不是试图证明为什么给定的解决方案是正确的,而是为实现这种解决方案提供了一条途径。
\n\n解决此类问题(实际上是各种各样的问题)的一种久经考验的方法是从小示例开始,然后逐步解决。这对于谜题是有效的,但对于现实中遇到的问题也是如此。
\n\n首先,请注意,这个问题是故意提出的,不会轻易地为您指明正确的方向。它让你觉得其中有某种魔力。仅给出正负列表,如何重构 N 个数字的列表?
\n\n好吧,你不能。对于 10 个数字,存在10! = 3628800可能的排列。并且只有2\xe2\x81\xb9 = 512可能的标志列表。这是一个非常巨大的差异。大多数原始列表在重建后会完全不同。
以下是如何解决该问题的概述:
\n\n那么,让我们从简单的开始(在开头为 None 写 0):
\n\n从鸟瞰角度来看,这是提出解决方案的一种可能途径。许多路线通往罗马。引入负数可能看起来很棘手,但在考虑了递归算法一段时间后,这是一个合乎逻辑的结论。
\n它之所以有效,是因为所有更改都是连续的,要么加一,要么减一,从同一位置开始递增和递减序列。这保证了我们总体上有一个顺序列表。例如,给定任意
[None, +, -, +, +, -]
Run Code Online (Sandbox Code Playgroud)
为了方便垂直翻转,我们可以看到
None 0
+ 1
- -1
+ 2
+ 3
- -2
Run Code Online (Sandbox Code Playgroud)
现在只需将它们向上移动两位(占-2):
2 3 1 4 5 0
+ - + + -
Run Code Online (Sandbox Code Playgroud)