题目解析
题目描述
题目要求判断一个给定的数组是否为单调数组。单调数组分为两种情况:
- 单调递增:对于所有索引
i <= j,nums[i] <= nums[j]。 - 单调递减:对于所有索引
i <= j,nums[i] >= nums[j]。
思路
- 初始检查:首先检查数组是否为空或只有一个元素,这种情况下数组一定是单调的。
- 标志位:使用一个标志位
is_increasing来记录数组的单调性。初始时设为None,表示尚未确定。 - 遍历数组:通过遍历数组,检查每个元素与下一个元素的关系,更新标志位。
- 返回结果:如果遍历过程中发现矛盾(即数组既不是单调递增也不是单调递减),则返回
False。如果遍历完数组没有发现矛盾,则返回True。
图解
假设我们有一个数组 nums = [1, 2, 2, 3]:
-
初始时,
is_increasing = None。 -
遍历数组:
nums[0] = 1和nums[1] = 2,1 < 2,设置is_increasing = True。nums[1] = 2和nums[2] = 2,2 == 2,继续。nums[2] = 2和nums[3] = 3,2 < 3,继续。
-
遍历结束,没有发现矛盾,返回
True。
代码详解
# 检查数组是否为空或只有一个元素
if len(nums) <= 1:
return True
# 初始化标志位,用于判断数组是单调递增还是单调递减
is_increasing = None
# 遍历数组,检查每个元素与下一个元素的关系
for i in range(len(nums) - 1):
if nums[i] < nums[i + 1]:
# 如果当前元素小于下一个元素,说明数组可能是单调递增的
if is_increasing is None:
is_increasing = True
elif is_increasing is False:
return False
elif nums[i] > nums[i + 1]:
# 如果当前元素大于下一个元素,说明数组可能是单调递减的
if is_increasing is None:
is_increasing = False
elif is_increasing is True:
return False
# 如果当前元素等于下一个元素,继续检查下一个元素
# 如果遍历完数组没有发现矛盾,说明数组是单调的
return True
if __name__ == '__main__':
print(solution(nums=[1, 2, 2, 3]) == True)
print(solution(nums=[6, 5, 4, 4]) == True)
print(solution(nums=[1, 3, 2, 4, 5]) == False)
总结
- 时间复杂度:
O(n),其中n是数组的长度。我们只需要遍历数组一次。 - 空间复杂度:
O(1),只使用了常数个额外的空间。 - 关键点:通过标志位
is_increasing来判断数组的单调性,并在遍历过程中及时发现矛盾。
个人感悟
1. 简洁性与效率:这个问题的解决方案非常简洁,只需要一次遍历数组,这让我意识到在编程中寻找最简单直接的方法的重要性。它不仅提高了代码的效率,也使得代码更易于理解和维护。
2. 标志位的使用:使用一个标志位来记录数组的单调性是一个巧妙的技巧。这让我思考到,在解决类似问题时,如何合理地使用变量来存储中间状态,可以极大地简化问题。
3. 边界条件的处理:在编写代码时,我总是提醒自己要检查边界条件,比如空数组或只有一个元素的情况。这种习惯有助于避免在实际运行时出现意外的错误。