单调数列

标签: 数组

难度: Easy

如果数组是单调递增或单调递减的,那么它是 单调

如果对于所有 i <= jnums[i] <= nums[j],那么数组 nums 是单调递增的。 如果对于所有 i <= jnums[i]> = nums[j],那么数组 nums 是单调递减的。

当给定的数组 nums 是单调数组时返回 true,否则返回 false

示例 1:

输入:nums = [1,2,2,3]
输出:true

示例 2:

输入:nums = [6,5,4,4]
输出:true

示例 3:

输入:nums = [1,3,2]
输出:false

提示:

  • 1 <= nums.length <= 105
  • -105 <= nums[i] <= 105

Submission

运行时间: 33 ms

内存: 27.0 MB

class Solution:
    def isMonotonic(self, nums: List[int]) -> bool:
        if len(nums) < 2:
            return True
        cur = nums[0]
        if nums[-1] >= nums[0]:
            # 检查单调递增
            for i in nums:
                if i < cur:
                    return False
                cur = i
        else:
            # 检查单调递减
            for i in nums:
                if i > cur:
                    return False
                cur = i
        return True

Explain

此题解首先检查数组长度是否小于2,如果是,则直接返回True,因为单个元素自然是单调的。接着,比较数组的第一个元素和最后一个元素来判断数组可能的单调性质。如果最后一个元素大于等于第一个元素,假设数组应该是单调递增的;反之,则假设单调递减。然后,对数组进行遍历,递增假设下,如果发现后面的元素比当前元素小,则返回False;递减假设下,如果后面的元素比当前元素大,则返回False。如果遍历完毕没有冲突,说明假设成立,返回True。

时间复杂度: O(n)

空间复杂度: O(1)

# 定义解题类和方法
class Solution:
    def isMonotonic(self, nums: List[int]) -> bool:
        # 检查数组长度是否小于2
        if len(nums) < 2:
            return True
        # 初始化当前元素
        cur = nums[0]
        # 根据数组首尾元素关系确定检查方向
        if nums[-1] >= nums[0]:
            # 检查单调递增
            for i in nums:
                if i < cur:
                    return False
                cur = i
        else:
            # 检查单调递减
            for i in nums:
                if i > cur:
                    return False
                cur = i
        return True

Explore

比较数组的第一个和最后一个元素的大小是为了快速确定整个数组可能的单调趋势。如果最后一个元素大于等于第一个元素,我们可以假设数组应该是单调递增的;如果最后一个元素小于第一个元素,则假设单调递减。这种方法可以避免一开始就进行完整的数组遍历,从而在一些情况下提高效率。

是的,如果数组中所有元素相等,我的算法也会正确判断数组为单调。无论是单调递增还是递减的检查,当所有元素相等时,条件 `i < cur` 或 `i > cur` 都不会满足,因此整个数组遍历完毕后,算法会返回True,正确地识别出数组是单调的。

当数组长度小于2时,即数组为空或只有一个元素时,可以直接判断为单调。这是因为单调性定义在有序关系上,而单个元素自身无法形成任何违反单调性的对比,因此自然是单调的。这种情况下直接返回True是合理的,因为没有更多的元素来破坏这种单调性。

使用变量 `cur` 来保存前一个元素的方法与直接比较相邻元素在逻辑上是相似的,但在某些情况下,使用 `cur` 可以带来代码的清晰性和可能的性能优化。例如,如果需要频繁访问当前元素的前一个元素,使用 `cur` 可以避免数组索引可能带来的额外计算。此外,这种方式可以使代码更易读,因为 `cur` 明确表示了在遍历过程中的“当前”元素,有助于理解和维护代码。