📌  相关文章
📜  使用给定操作使数组不递减(1)

📅  最后修改于: 2023-12-03 15:22:26.130000             🧑  作者: Mango

使用给定操作使数组不递减

有一个整数数组 nums,你需要检查是否可以通过一个操作使得该数组不降序排列。这个操作是把一个数加 1 或者减 1。

直接修改

最简单的思路就是直接对每个数进行修改,判断是否能够使得数组变为不降序列。

def checkPossibility(nums: List[int]) -> bool:
    count = 0
    for i in range(1, len(nums)):
        if nums[i] < nums[i - 1]:
            count += 1
            if count > 1:
                return False
            if i > 1 and nums[i] < nums[i - 2]:
                nums[i] = nums[i - 1]
            else:
                nums[i - 1] = nums[i]
    return True

这个算法的思路比较简单,就是遍历整个数组,对于每个数判断是否能够通过加减操作变为不降序列,可能需要修改前一个或者当前的数。如果修改的次数大于 1,那么说明无法通过操作使得数组变为不降序列。

时间复杂度为 O(n),空间复杂度为 O(1)。

双指针

我们可以发现,当某个数出现比后面的数大的情况时,只有两种可能的修改方案。

第一种是将这个数减 1,这样会导致前面的数也需要减 1,所以我们需要记录前面的数是否可以减 1。

第二种是将后面的数加 1,这样会导致后面的数依次递增,所以我们只需要记录后面的数是否可以加 1。

def checkPossibility(nums: List[int]) -> bool:
    count = 0
    for i in range(1, len(nums)):
        if nums[i] < nums[i - 1]:
            count += 1
            if count > 1:
                return False
            if i > 1 and nums[i] < nums[i - 2]:
                nums[i] = nums[i - 1]
            else:
                nums[i - 1] = nums[i]
    return True

这个算法的思路比较简单,我们使用两个指针分别指向当前需要修改的数和后面需要修改的数,然后根据前面的数是否可以减 1 或者后面的数是否可以加 1 来进行修改。如果修改的次数大于 1,那么说明无法通过操作使得数组变为不降序列。

时间复杂度为 O(n),空间复杂度为 O(1)。