判断数组是否单调 | 豆包MarsCode AI刷题

51 阅读4分钟

小S最近在研究一些数组的性质,她发现有一种非常有趣的数组被称为 单调数组。如果一个数组是单调递增或单调递减的,那么它就是单调的。 当对于所有索引i<=j时,nums[i]<= nums[j],数组nums是单调递增的。当对于所有索引i<=j时,nums[i]>= nums[j],数组nums是单调递减的。你需要编写一个程序来判断给定的数组nums是否为单调数组。如果是,返回true,否则返回false.

测试用例

样例1:

 输入:nums =[1223]
输出:True

样例2:

输入:nums =[6544]
输出:True

样例3:

输入:nums=[13245]
输出:False

为了判断一个数组是否是单调数组,我们需要检查数组是否是单调递增或单调递减的。具体来说,我们需要检查以下两个条件之一是否成立:

  1. 单调递增:对于所有索引 i≤j,有 nums[i]≤nums[j]
  2. 单调递减:对于所有索引 i≤j,有 nums[i]≥nums[j]

实现思路

  1. 初始化标志变量:使用两个布尔变量 increasing 和 decreasing,分别表示数组是否是单调递增和单调递减的。

  2. 遍历数组:从第二个元素开始遍历数组,比较当前元素与前一个元素的关系。

  3. 更新标志变量

    • 如果当前元素大于前一个元素,设置 increasing 为 True
    • 如果当前元素小于前一个元素,设置 decreasing 为 True
  4. 检查标志变量:如果在遍历过程中,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

代码解释

  1. 初始化标志变量

    • increasing 和 decreasing 初始值都为 True,表示我们假设数组既可能是单调递增的,也可能是单调递减的。
  2. 遍历数组

    • 从第二个元素开始遍历数组(索引从 1 开始)。
    • 比较当前元素 nums[i] 和前一个元素 nums[i - 1]
  3. 更新标志变量

    • 如果 nums[i] > nums[i - 1],说明数组在这一点上是单调递增的,因此将 decreasing 设为 False
    • 如果 nums[i] < nums[i - 1],说明数组在这一点上是单调递减的,因此将 increasing 设为 False
  4. 检查标志变量

    • 如果在遍历过程中,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

代码解释

  1. 早期终止

    • 如果在遍历过程中已经确定数组既不是单调递增的,也不是单调递减的,直接返回 False
    • 例如,如果 increasing 为 True 且 nums[i] < nums[i - 1],说明数组不是单调递增的,直接返回 False
  2. 减少条件判断

    • 使用 increasing 和 decreasing 变量来记录当前的单调性状态。
    • 只有在必要时才更新这些变量,避免多余的条件判断。

进一步优化

如果数组非常大,可以考虑使用并行处理或分块处理来进一步提高性能。例如,可以将数组分成多个块,每个块独立判断其单调性,最后合并结果。但这通常需要更复杂的实现和更多的资源开销,适用于极端情况。

测试样例

  • 样例1

    • 输入:nums = [1, 2, 2, 3]
    • 输出:True
    • 解释:数组是单调递增的。
  • 样例2

    • 输入:nums = [6, 5, 4, 4]
    • 输出:True
    • 解释:数组是单调递减的。
  • 样例3

    • 输入:nums = [1, 3, 2, 4, 5]
    • 输出:False
    • 解释:数组既不是单调递增的,也不是单调递减的。