Swifts中的非递增数组

LeetCode有一个有趣的问题,即非递增数组。

给定一个具有n整数的数组,您的任务是通过最多修改1元素来检查它是否可以不减少。

如果array[i] <= array[i + 1]对每个i (1 <= i <n)成立,则我们定义数组为非递减array[i] <= array[i + 1]

因此(为什么我们不使用术语“增加”来表示不减少,我永远不会知道),我们正在寻找造成增加的情况:

而不是减少:

并且我们可以在数组中进行一个更改。

在这里重要的是在遍历数组时不要更改数组,而要在遍历数组时做出决定。

简单的情况

简单的情况如下所示,我们可以将数组中的第一个元素更改为1,从而增加数组

天真的(不正确的)解决方案

这是Swift中的代码:

为了使下面的数组增加一个[3,4,2,3],天真的解决方案声称在数组中只需要进行单个更改就给出了错误的答案:

这是因为幼稚的解决方案假定我们可以更改“不正确”的元素i,使得array [i]≥array [i_1] && array [i]≥array [i + 1]。 对于第三个元素,这是不可能的-即使我们将元素更改为4或5,它仍将大于数组(3)中的第4个元素。

更改元素时,我们尝试始终与之前的元素进行比较。 在第一种情况下,这是行不通的,因此我们可以将其从代码中排除-我们在元素中存在“ dip”的位置识别出此问题。

不正确的代码

我们在数组的第一个和最后一个元素中考虑了边缘情况:

在这里,我们有一个与上面类似的情况,但是逻辑失败了,因为我们有了一个新的情况。 我们可以在这里减少最大元素(2),并且我们有一个不减少(增加)的数组。

Se可以使用相同的示例演示算法如何逐步解决此问题(并且我们正在寻找count> 1以指示需要进行多次更改):

这是完整的代码。 请注意,我们不仅添加了以下条件:

如果 i!= 1 && nums [i — 2]> nums [i] {

但我们也使用

继续

仅当且仅当该元素大于其前两个位置的元素时,才停止更新前一个元素。