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

64 阅读3分钟

问题描述

小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 <= jnums[i] <= nums[j]。 单调递减:对于所有索引 i <= jnums[i] >= nums[j]。 2.初始检查: 如果数组长度小于等于2,直接返回true,因为长度为1或2的数组一定是单调的。 3.遍历数组: 使用一个循环遍历数组,检查每个元素与下一个元素的关系。 使用两个布尔变量increasingdecreasing来分别表示数组是否单调递增或单调递减。 4.更新标志: 如果当前元素大于下一个元素,则数组不可能是单调递增,将increasing设为false。 如果当前元素小于下一个元素,则数组不可能是单调递减,将decreasing设为false。 5.提前返回: 如果在遍历过程中发现数组既不是单调递增也不是单调递减,可以提前返回false。 6.返回结果: 如果遍历结束后,increasingdecreasing中有一个为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.寻找最值方法:找出数组中得最大值和最小值,如果最大值在最后一个元素,最小值在第一个元素,则是单调递增数列。如果最大值在第一个元素,最小值在第一个元素,则是单调递减。如果最大值和最小值都在同一个位置,则是数组中的所有元素都相等,这种情况两个结果都不是。