题目分析
本题的目标是判断一个给定的数组是否是单调数组。我们需要判断数组是否满足以下条件之一:
- 单调递增:对于所有索引
i <= j,nums[i] <= nums[j]。 - 单调递减:对于所有索引
i <= j,nums[i] >= nums[j]。
这意味着数组中的元素要么是从左到右递增的(可能有相等元素),要么是从左到右递减的(可能有相等元素)。
思路
要解决这个问题,我们可以通过如下几个步骤来判断:
- 遍历数组:我们需要遍历数组,并通过比较相邻元素来判断数组是否单调。
- 判断单调递增:如果数组是单调递增的,那么对于任意相邻的元素
nums[i]和nums[i+1],都应该满足nums[i] <= nums[i+1]。 - 判断单调递减:如果数组是单调递减的,那么对于任意相邻的元素
nums[i]和nums[i+1],都应该满足nums[i] >= nums[i+1]。 - 同时判断两种情况:我们可以通过设置两个标志变量,分别用于判断是否递增和递减,如果两个标志都不成立,那么就说明数组既不是单调递增也不是单调递减。
步骤
-
初始化标志变量:设置两个标志
is_increasing和is_decreasing,初始值都为True。 -
遍历数组:
- 如果发现
nums[i] > nums[i+1],则说明当前数组不是单调递增的,将is_increasing设置为False。 - 如果发现
nums[i] < nums[i+1],则说明当前数组不是单调递减的,将is_decreasing设置为False。
- 如果发现
-
判断结果:遍历完成后,如果
is_increasing或is_decreasing之一为True,说明数组是单调的,返回True;否则返回False。public class Solution { public boolean isMonotonic(int[] nums) { // 初始化两个标志 boolean isIncreasing = true; boolean isDecreasing = true; // 遍历数组 for (int i = 0; i < nums.length - 1; i++) { if (nums[i] > nums[i + 1]) { isIncreasing = false; // 如果当前元素大于下一个元素,说明不是递增 } if (nums[i] < nums[i + 1]) { isDecreasing = false; // 如果当前元素小于下一个元素,说明不是递减 } } // 判断是否单调 return isIncreasing || isDecreasing; } }
时间复杂度分析
- 时间复杂度:O(n),其中
n是数组nums的长度。我们只需要一次遍历数组,时间复杂度是线性的。 - 空间复杂度:O(1),只用了常数空间来存储标志变量,因此空间复杂度为常数级别。
总结
通过遍历数组并同时检查递增和递减的情况,我们能够有效地判断一个数组是否为单调数组。此方法时间复杂度为O(n),能够快速处理大规模数据。同时,由于只需要常数空间,因此空间复杂度较低,适用于大多数场景。