1.题目描述
小S最近在研究一些数组的性质,她发现有一种非常有趣的数组被称为 单调数组。如果一个数组是单调递增或单调递减的,那么它就是单调的。
当对于所有索引i <= j时,nums[i] <= nums[j],数组nums是单调递增的。
当对于所有索引i <= j时,nums[i] >= nums[j],数组nums是单调递减的。
你需要编写一个程序来判断给定的数组nums是否为单调数组。如果是,返回true,否则返回false。
2.题目分析
题目要求判断一个整型数组是否为单调数组,即要么完全递增,要么完全递减。这意味着我们需要检查数组中任意两个连续元素之间的顺序关系,看其是否符合递增或递减的规则。
3.难点分析
难点在于如何高效地遍历数组并准确判断出数组的整体趋势。这里有两个潜在的陷阱:
数组可能存在相等的元素,这种情况下,连续的相等元素不应改变递增或递减的判断标准。
需要考虑数组的边界情况,比如空数组或只有一个元素的数组应该被视为单调数组。
4.解题思路
我们可以采用双标记策略:
设立两个布尔变量increasing和decreasing分别记录数组是否可能为递增或递减。
遍历数组,通过比较相邻元素来更新这两个标记。
如果遇到任何不符合递增或递减模式的地方,则相应标记变为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.关键步骤和细节
初始化increasing和decreasing都为true,假设数组最开始既可能是递增也可能是递减的。
开始遍历数组,从第二个元素开始,与前一个元素对比。
如果当前元素大于前一个元素,decreasing置为false;反之,如果小于,则increasing置为false。
如果在遍历过程中发现increasing和decreasing都为false,提前结束循环,返回false。
遍历完成后,检查increasing或decreasing任一为true,则返回true,否则返回false。
7.总结
本题考查了数组遍历和逻辑判断的能力,通过设置双标记的方式,既考虑了递增递减的判断,又妥善处理了相等元素的情况,最终达到了高效解决问题的目的。通过双标记得到了清晰而有效的解决方案,同时时间复杂度较低,避免了不必要的计算。