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

84 阅读3分钟

1.题目描述 小S最近在研究一些数组的性质,她发现有一种非常有趣的数组被称为 单调数组。如果一个数组是单调递增或单调递减的,那么它就是单调的。 当对于所有索引i <= j时,nums[i] <= nums[j],数组nums是单调递增的。 当对于所有索引i <= j时,nums[i] >= nums[j],数组nums是单调递减的。 你需要编写一个程序来判断给定的数组nums是否为单调数组。如果是,返回true,否则返回false。 2.题目分析 题目要求判断一个整型数组是否为单调数组,即要么完全递增,要么完全递减。这意味着我们需要检查数组中任意两个连续元素之间的顺序关系,看其是否符合递增或递减的规则。 3.难点分析 难点在于如何高效地遍历数组并准确判断出数组的整体趋势。这里有两个潜在的陷阱: 数组可能存在相等的元素,这种情况下,连续的相等元素不应改变递增或递减的判断标准。 需要考虑数组的边界情况,比如空数组或只有一个元素的数组应该被视为单调数组。 4.解题思路 我们可以采用双标记策略: 设立两个布尔变量increasingdecreasing分别记录数组是否可能为递增或递减。 遍历数组,通过比较相邻元素来更新这两个标记。 如果遇到任何不符合递增或递减模式的地方,则相应标记变为false。 最终,如果至少有一个标记保持为true,说明数组满足单调条件。 5.具体代码实现

public class Main {

public static boolean isMonotonic(int[] nums) {
    
    boolean increasing = true;
    boolean decreasing = true;
    
    for (int i = 1; i < nums.length; i++) {
        if (nums[i] > nums[i - 1]) {
            decreasing = false;
        }
        if (nums[i] < nums[i - 1]) {
            increasing = false;
        }
        
        if (!increasing && !decreasing) {
            return false;
        }
    }
    
    return increasing || decreasing;
}

public static void main(String[] args) {
    System.out.println(isMonotonic(new int[]{1, 2, 2, 3}) == true);
    System.out.println(isMonotonic(new int[]{6, 5, 4, 4}) == true);
    System.out.println(isMonotonic(new int[]{1, 3, 2, 4, 5}) == false);
}
}

6.关键步骤和细节 初始化increasingdecreasing都为true,假设数组最开始既可能是递增也可能是递减的。 开始遍历数组,从第二个元素开始,与前一个元素对比。 如果当前元素大于前一个元素,decreasing置为false;反之,如果小于,则increasing置为false。 如果在遍历过程中发现increasingdecreasing都为false,提前结束循环,返回false。 遍历完成后,检查increasingdecreasing任一为true,则返回true,否则返回false。 7.总结 本题考查了数组遍历和逻辑判断的能力,通过设置双标记的方式,既考虑了递增递减的判断,又妥善处理了相等元素的情况,最终达到了高效解决问题的目的。通过双标记得到了清晰而有效的解决方案,同时时间复杂度较低,避免了不必要的计算。