Easy
题目描述
如果数组是单调递增或单调递减的,那么它是单调的。
如果对于所有 i <= j,nums[i] <= nums[j],那么数组 nums 是单调递增的。如果对于所有 i <= j,nums[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],则不是递减。
解法二:单次遍历(推荐)
更优雅的方法是在一次遍历中同时检查两个条件。我们用两个布尔变量 increasing 和 decreasing 分别记录是否可能单调递增和单调递减。初始时都为 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 是数组的长度。我们只需要遍历数组一次,使用常数级别的额外空间。