小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
为了判断一个数组是否是单调数组,我们需要检查数组是否是单调递增或单调递减的。具体来说,我们需要检查以下两个条件之一是否成立:
- 单调递增:对于所有索引 i≤j,有 nums[i]≤nums[j]
- 单调递减:对于所有索引 i≤j,有 nums[i]≥nums[j]
实现思路
-
初始化标志变量:使用两个布尔变量
increasing和decreasing,分别表示数组是否是单调递增和单调递减的。 -
遍历数组:从第二个元素开始遍历数组,比较当前元素与前一个元素的关系。
-
更新标志变量:
- 如果当前元素大于前一个元素,设置
increasing为True。 - 如果当前元素小于前一个元素,设置
decreasing为True。
- 如果当前元素大于前一个元素,设置
-
检查标志变量:如果在遍历过程中,
increasing和decreasing都为True,则数组不是单调的,返回False。否则,返回True。
def solution(nums):
increasing = True
decreasing = True
for i in range(1, len(nums)):
if nums[i] > nums[i - 1]:
decreasing = False
if nums[i] < nums[i - 1]:
increasing = False
return increasing or decreasing
# 测试样例
print(solution([1, 2, 2, 3])) # 输出: True
print(solution([6, 5, 4, 4])) # 输出: True
print(solution([1, 3, 2, 4, 5])) # 输出: False
代码解释
-
初始化标志变量:
increasing和decreasing初始值都为True,表示我们假设数组既可能是单调递增的,也可能是单调递减的。
-
遍历数组:
- 从第二个元素开始遍历数组(索引从 1 开始)。
- 比较当前元素
nums[i]和前一个元素nums[i - 1]。
-
更新标志变量:
- 如果
nums[i] > nums[i - 1],说明数组在这一点上是单调递增的,因此将decreasing设为False。 - 如果
nums[i] < nums[i - 1],说明数组在这一点上是单调递减的,因此将increasing设为False。
- 如果
-
检查标志变量:
- 如果在遍历过程中,
increasing和decreasing都为False,说明数组既不是单调递增的,也不是单调递减的,返回False。
- 如果在遍历过程中,
优化程序性能的关键在于减少不必要的计算和提高算法的效率。对于判断数组是否为单调数组的问题,我们可以进一步优化现有的实现。以下是一些优化建议:
1. 早期终止
如果在遍历过程中已经确定数组既不是单调递增的,也不是单调递减的,可以提前终止循环,避免不必要的遍历。
2. 减少条件判断
通过合理的设计,减少条件判断的次数,从而提高性能。
优化后的实现
def solution(nums):
if len(nums) <= 2:
return True # 数组长度小于等于2,一定是单调的
increasing = None
decreasing = None
for i in range(1, len(nums)):
if nums[i] > nums[i - 1]:
if decreasing:
return False # 已经确定是单调递减的,但又发现递增,直接返回False
increasing = True
elif nums[i] < nums[i - 1]:
if increasing:
return False # 已经确定是单调递增的,但又发现递减,直接返回False
decreasing = True
return True
# 测试样例
print(solution([1, 2, 2, 3])) # 输出: True
print(solution([6, 5, 4, 4])) # 输出: True
print(solution([1, 3, 2, 4, 5])) # 输出: False
代码解释
-
早期终止:
- 如果在遍历过程中已经确定数组既不是单调递增的,也不是单调递减的,直接返回
False。 - 例如,如果
increasing为True且nums[i] < nums[i - 1],说明数组不是单调递增的,直接返回False。
- 如果在遍历过程中已经确定数组既不是单调递增的,也不是单调递减的,直接返回
-
减少条件判断:
- 使用
increasing和decreasing变量来记录当前的单调性状态。 - 只有在必要时才更新这些变量,避免多余的条件判断。
- 使用
进一步优化
如果数组非常大,可以考虑使用并行处理或分块处理来进一步提高性能。例如,可以将数组分成多个块,每个块独立判断其单调性,最后合并结果。但这通常需要更复杂的实现和更多的资源开销,适用于极端情况。
测试样例
-
样例1:
- 输入:
nums = [1, 2, 2, 3] - 输出:
True - 解释:数组是单调递增的。
- 输入:
-
样例2:
- 输入:
nums = [6, 5, 4, 4] - 输出:
True - 解释:数组是单调递减的。
- 输入:
-
样例3:
- 输入:
nums = [1, 3, 2, 4, 5] - 输出:
False - 解释:数组既不是单调递增的,也不是单调递减的。
- 输入: