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 <= 10^5
  • -10^5 <= nums[i] <= 10^5

解题思路

这道题要求判断一个数组是否单调,即要么单调递增,要么单调递减。

解法一:双重检查 最直观的方法是分别检查数组是否单调递增和单调递减,只要满足其中一个条件即可。遍历数组,对于递增检查,如果发现 nums[i] > nums[i+1],则不是递增;对于递减检查,如果发现 nums[i] < nums[i+1],则不是递减。

解法二:单次遍历(推荐) 更优雅的方法是在一次遍历中同时检查两个条件。我们用两个布尔变量 increasingdecreasing 分别记录是否可能单调递增和单调递减。初始时都为 true,在遍历过程中,如果发现违反递增条件,将 increasing 设为 false;如果违反递减条件,将 decreasing 设为 false。最后只要有一个为 true 即可。

这种方法的优点是只需要一次遍历,而且逻辑清晰,代码简洁。当数组很大时,如果在前面就能确定既不是递增也不是递减,可以提前返回 false

代码实现

class Solution {
public:
    bool isMonotonic(vector<int>& nums) {
        bool increasing = true;
        bool decreasing = true;
        
        for (int i = 1; i < nums.size(); i++) {
            if (nums[i] < nums[i-1]) {
                increasing = false;
            }
            if (nums[i] > nums[i-1]) {
                decreasing = false;
            }
        }
        
        return increasing || decreasing;
    }
};
class Solution:
    def isMonotonic(self, nums: List[int]) -> bool:
        increasing = True
        decreasing = True
        
        for i in range(1, len(nums)):
            if nums[i] < nums[i-1]:
                increasing = False
            if nums[i] > nums[i-1]:
                decreasing = False
        
        return increasing or decreasing
public class Solution {
    public bool IsMonotonic(int[] nums) {
        bool increasing = true;
        bool decreasing = true;
        
        for (int i = 1; i < nums.Length; i++) {
            if (nums[i] < nums[i-1]) {
                increasing = false;
            }
            if (nums[i] > nums[i-1]) {
                decreasing = false;
            }
        }
        
        return increasing || decreasing;
    }
}
var isMonotonic = function(nums) {
    let increasing = true;
    let decreasing = true;
    
    for (let i = 1; i < nums.length; i++) {
        if (nums[i] < nums[i-1]) {
            increasing = false;
        }
        if (nums[i] > nums[i-1]) {
            decreasing = false;
        }
    }
    
    return increasing || decreasing;
};

复杂度分析

复杂度大小
时间复杂度O(n)
空间复杂度O(1)

其中 n 是数组的长度。我们只需要遍历数组一次,使用常数级别的额外空间。

相关题目