问题描述
我们需要判断一个给定的数组是否为单调数组。单调数组有两种情况:
- 单调递增:对于所有索引
i <= j,nums[i] <= nums[j]。 - 单调递减:对于所有索引
i <= j,nums[i] >= nums[j]。
解题思路
-
初始化标志:
- 首先,我们需要确定数组是单调递增还是单调递减。可以通过比较数组的前两个元素来初始化一个标志。
- 如果
nums[0] <= nums[1],则数组可能是单调递增的。 - 如果
nums[0] >= nums[1],则数组可能是单调递减的。
-
遍历数组:
- 遍历数组中的每一对相邻元素,检查它们是否符合初始化的单调性标志。
- 如果发现递增数组中有递减的情况,或者递减数组中有递增的情况,立即返回
false。
-
返回结果:
- 如果在遍历过程中没有发现违反单调性的情况,则返回
true。
- 如果在遍历过程中没有发现违反单调性的情况,则返回
关键步骤解释
-
初始化标志:
- 通过比较数组的前两个元素来确定数组是单调递增还是单调递减。
bool increasing = nums[0] <= nums[1];bool decreasing = nums[0] >= nums[1];
-
遍历数组:
- 在遍历过程中,检查每一对相邻元素是否符合初始化的单调性标志。
for (int i = 1; i < nums.size() - 1; ++i)- 如果发现递增数组中有递减的情况,或者递减数组中有递增的情况,立即返回
false。
-
返回结果:
- 如果在遍历过程中没有发现违反单调性的情况,则返回
true。
- 如果在遍历过程中没有发现违反单调性的情况,则返回
详细步骤解释
-
初始化标志:
-
单调递增标志:
bool increasing = nums[0] <= nums[1];- 如果数组的第一个元素小于等于第二个元素,则数组可能是单调递增的。
-
单调递减标志:
bool decreasing = nums[0] >= nums[1];- 如果数组的第一个元素大于等于第二个元素,则数组可能是单调递减的。
-
-
遍历数组:
-
循环遍历:
for (int i = 1; i < nums.size() - 1; ++i)- 从第二个元素开始遍历到倒数第二个元素。
-
检查单调递增:
-
if (increasing && nums[i] > nums[i + 1])- 如果当前元素大于下一个元素,说明数组不是单调递增的,返回
false。
- 如果当前元素大于下一个元素,说明数组不是单调递增的,返回
-
-
检查单调递减:
-
if (decreasing && nums[i] < nums[i + 1])- 如果当前元素小于下一个元素,说明数组不是单调递减的,返回
false。
- 如果当前元素小于下一个元素,说明数组不是单调递减的,返回
-
-
-
返回结果:
- 如果在遍历过程中没有发现违反单调性的情况,则返回
true。
- 如果在遍历过程中没有发现违反单调性的情况,则返回
测试样例
-
样例1:
nums = [1, 2, 2, 3]- 输出:
True - 解释:数组是单调递增的。
- 输出:
-
样例2:
nums = [6, 5, 4, 4]- 输出:
True - 解释:数组是单调递减的。
- 输出:
-
样例3:
nums = [1, 3, 2, 4, 5]- 输出:
False - 解释:数组既不是单调递增也不是单调递减。
- 输出:
总结
通过初始化标志和遍历数组,我们可以有效地判断一个数组是否为单调数组。这个方法的时间复杂度为 O(n),其中 n 是数组的长度。