问题描述
小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
思路提示:
1.理解单调数组的定义
单调递增:对于所有索引 i <= j,nums[i] <= nums[j]。
单调递减:对于所有索引 i <= j,nums[i] >= nums[j]。
2.初始检查:
如果数组长度小于等于2,直接返回true,因为长度为1或2的数组一定是单调的。
3.遍历数组:
使用一个循环遍历数组,检查每个元素与下一个元素的关系。
使用两个布尔变量increasing和decreasing来分别表示数组是否单调递增或单调递减。
4.更新标志:
如果当前元素大于下一个元素,则数组不可能是单调递增,将increasing设为false。
如果当前元素小于下一个元素,则数组不可能是单调递减,将decreasing设为false。
5.提前返回:
如果在遍历过程中发现数组既不是单调递增也不是单调递减,可以提前返回false。
6.返回结果:
如果遍历结束后,increasing或decreasing中有一个为true,则数组是单调的,返回true。
否则,返回
代码如下:public class Main {
public static boolean solution(int[] nums) {
// 如果数组长度小于等于2,直接返回true,因为长度为1或2的数组一定是单调的
if (nums.length <= 2) return true;
// 初始化一个标志,用于判断数组是单调递增还是单调递减
boolean increasing = true;
boolean decreasing = true;
// 遍历数组,检查每个元素与下一个元素的关系
for (int i = 0; i < nums.length - 1; i++) {
// 如果当前元素大于下一个元素,则不可能是单调递增
if (nums[i] > nums[i + 1]) {
increasing = false;
}
// 如果当前元素小于下一个元素,则不可能是单调递减
if (nums[i] < nums[i + 1]) {
decreasing = false;
}
}
// 如果数组既不是单调递增也不是单调递减,返回false
// 否则返回true
return increasing || decreasing;
}
public static void main(String[] args) {
System.out.println(solution(new int[]{1, 2, 2, 3}) == true);
System.out.println(solution(new int[]{6, 5, 4, 4}) == true);
System.out.println(solution(new int[]{1, 3, 2, 4, 5}) == false);
}
}
对于题目有两种方法判断数组是否单调: 1.比较相邻元素法:如果对于所有的i<=j,都有nums[i]<=nums[j],则数组是单调递增。 如果对于所有的i<=j,都有nums[i]>=nums[j],则数组是单调递减。 2.寻找最值方法:找出数组中得最大值和最小值,如果最大值在最后一个元素,最小值在第一个元素,则是单调递增数列。如果最大值在第一个元素,最小值在第一个元素,则是单调递减。如果最大值和最小值都在同一个位置,则是数组中的所有元素都相等,这种情况两个结果都不是。