小S最近在研究一些数组的性质,她发现有一种非常有趣的数组被称为 单调数组。如果一个数组是单调递增或单调递减的,那么它就是单调的。
- 当对于所有索引
i <= j时,nums[i] <= nums[j],数组nums是单调递增的。 - 当对于所有索引
i <= j时,nums[i] >= nums[j],数组nums是单调递减的。 你需要编写一个程序来判断给定的数组nums是否为单调数组。如果是,返回true,否则返回false。 要判断一个数组是否为单调数组,我们可以遵循以下步骤:
-
初始化变量:
- 定义两个布尔变量,
increasing和decreasing,初始值都设为true。这两个变量分别用来表示数组是否单调递增和单调递减。
- 定义两个布尔变量,
-
遍历数组:
- 从数组的第二个元素开始(索引为 1),遍历整个数组直到最后一个元素。对于每个元素
nums[i]和它的前一个元素nums[i-1],进行比较。
- 从数组的第二个元素开始(索引为 1),遍历整个数组直到最后一个元素。对于每个元素
-
比较元素:
- 对于每个
nums[i]和nums[i-1]:- 如果
nums[i] < nums[i-1],则数组不可能是单调递增的,因此将increasing设置为false。 - 如果
nums[i] > nums[i-1],则数组不可能是单调递减的,因此将decreasing设置为false。
- 如果
- 对于每个
-
检查结果:
- 在遍历结束后,检查
increasing和decreasing的值:- 如果
increasing或decreasing中至少有一个为true,则数组是单调的,返回true。 - 如果两个变量都为
false,则数组不是单调的,返回false。
- 如果
- 在遍历结束后,检查
-
特殊情况处理:
- 如果数组长度为 1 或者数组已经是有序的(全部元素相同),则可以直接返回
true,因为这样的数组既是单调递增的也是单调递减的。
- 如果数组长度为 1 或者数组已经是有序的(全部元素相同),则可以直接返回
以下是这个算法的伪代码实现:
function isMonotonic(nums):
if length(nums) <= 1:
return true
increasing = true
decreasing = true
for i from 1 to length(nums) - 1:
if nums[i] < nums[i - 1]:
increasing = false
if nums[i] > nums[i - 1]:
decreasing = false
return increasing or decreasing
这个算法的时间复杂度是 O(n),其中 n 是数组 nums 的长度,因为我们只需要遍历数组一次。空间复杂度是 O(1),因为我们只使用了常数级别的额外空间。
对于包含重复元素的数组,判断是否为单调数组的算法不需要特别的优化,因为包含重复元素并不影响数组的单调性。一个数组可以是单调递增的,即使它包含相同的元素,只要没有元素违反递增的规则(即对于所有 i < j,nums[i] <= nums[j])。同样,一个数组也可以是单调递减的,即使它包含相同的元素,只要没有元素违反递减的规则(即对于所有 i < j,nums[i] >= nums[j])。
因此,上面提供的算法已经足够处理包含重复元素的数组。重复元素不会改变比较的结果,因为它们不会违反单调性的条件。算法的核心是比较相邻元素,而不是跳过重复的元素。
这里是处理包含重复元素的数组的算法步骤,实际上与之前的算法相同:
-
初始化变量:
- 定义两个布尔变量,
increasing和decreasing,初始值都设为true。
- 定义两个布尔变量,
-
遍历数组:
- 从数组的第二个元素开始(索引为 1),遍历整个数组直到最后一个元素。
-
比较元素:
-
对于每个
nums[i]和它的前一个元素nums[i-1]:- 如果
nums[i] < nums[i-1],则将increasing设置为false。 - 如果
nums[i] > nums[i-1],则将decreasing设置为false。
- 如果
-
-
检查结果:
-
在遍历结束后,检查
increasing和decreasing的值:- 如果
increasing或decreasing中至少有一个为true,则数组是单调的,返回true。 - 如果两个变量都为
false,则数组不是单调的,返回false。
- 如果
-
-
特殊情况处理:
- 如果数组长度为 1 或者数组已经是有序的(全部元素相同),则可以直接返回
true。
- 如果数组长度为 1 或者数组已经是有序的(全部元素相同),则可以直接返回
伪代码实现与之前相同,不需要修改: