问题描述
小S最近在研究一些数组的性质,她发现有一种非常有趣的数组被称为 单调数组。如果一个数组是单调递增或单调递减的,那么它就是单调的。
- 当对于所有索引
i <= j时,nums[i] <= nums[j],数组nums是单调递增的。 - 当对于所有索引
i <= j时,nums[i] >= nums[j],数组nums是单调递减的。
你需要编写一个程序来判断给定的数组nums是否为单调数组。如果是,返回true,否则返回false。
解析
好的,让我们详细解析一下这个题目及其解法。
题目描述
小S最近在研究一些数组的性质,她发现有一种非常有趣的数组被称为 单调数组。如果一个数组是单调递增或单调递减的,那么它就是单调的。
- 当对于所有索引
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, 4, 5]输出:False
解题思路
-
理解单调数组的定义:
- 单调递增:数组中每个元素都大于或等于前一个元素。
- 单调递减:数组中每个元素都小于或等于前一个元素。
-
初始化标志:
- 我们可以使用两个布尔变量
is_increasing和is_decreasing来分别表示数组是否单调递增和单调递减。 - 初始时,将这两个变量都设置为
True。
- 我们可以使用两个布尔变量
-
遍历数组:
- 从数组的第二个元素开始,遍历数组。
- 对于每个元素
nums[i],比较它与前一个元素nums[i-1]:- 如果
nums[i] < nums[i-1],则数组不可能是单调递增的,因此将is_increasing设置为False。 - 如果
nums[i] > nums[i-1],则数组不可能是单调递减的,因此将is_decreasing设置为False。
- 如果
-
返回结果:
- 遍历结束后,如果
is_increasing或is_decreasing中有一个为True,则数组是单调的,返回True。 - 否则,返回
False。
- 遍历结束后,如果
数据结构选择
- 使用布尔变量来记录数组的单调性。
算法步骤
- 初始化
is_increasing和is_decreasing为True。 - 遍历数组,比较相邻元素。
- 根据比较结果更新
is_increasing和is_decreasing。 - 返回
is_increasing或is_decreasing中为True的结果。
代码实现
def solution(nums: list) -> bool:
# 初始化标志
is_increasing = True
is_decreasing = True
# 遍历数组
for i in range(1, len(nums)):
if nums[i] < nums[i - 1]:
is_increasing = False
if nums[i] > nums[i - 1]:
is_decreasing = False
# 返回结果
return is_increasing or is_decreasing
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)
代码解释
-
初始化标志:
is_increasing和is_decreasing分别用于记录数组是否单调递增和单调递减。
-
遍历数组:
- 从数组的第二个元素开始遍历,比较当前元素
nums[i]和前一个元素nums[i-1]。 - 如果
nums[i] < nums[i-1],则数组不可能是单调递增的,因此将is_increasing设置为False。 - 如果
nums[i] > nums[i-1],则数组不可能是单调递减的,因此将is_decreasing设置为False。
- 从数组的第二个元素开始遍历,比较当前元素
-
返回结果:
- 遍历结束后,如果
is_increasing或is_decreasing中有一个为True,则数组是单调的,返回True。 - 否则,返回
False。
- 遍历结束后,如果
测试样例
- 代码中包含了三个测试样例,分别对应题目中的样例1、样例2和样例3。
- 运行代码后,输出结果应为
True,表示代码正确。
通过这种方式,我们可以高效地判断数组是否为单调数组。