1. 整体思路
核心问题
我们需要验证数组是否为 升 -> 降 -> 升 的形状。
这个形状特征可以转化为单调性的变化次数:
- 开始:必须是上升的 (
up)。 - 转折点 1 (峰):从
升变为降。 - 转折点 2 (谷):从
降变为升。 - 结束:必须保持上升状态直到结束,不能再有转折点。
这意味着,整个数组应该恰好包含 2 个转折点,或者说包含 3 个单调区间 (升、降、升)。
算法逻辑
- 初始检查:
nums[0] >= nums[1]。如果开头不是上升的,直接返回false。 - 计数器
cnt:初始化为 1,代表这是第 1 个单调区间(初始的上升段)。 - 遍历:从
i = 2开始遍历到末尾。- 平坡检查:如果
nums[i-1] == nums[i],说明有平坡,不符合严格单调性,返回false。 - 转折点检测:
nums[i-2] < nums[i-1]:前一步是上升。nums[i-1] < nums[i]:当前步是上升。- 如果这两个状态不一致(例如前一步升,当前步降;或前一步降,当前步升),说明发生了转折。
- 发生转折时,区间计数
cnt++。
- 平坡检查:如果
- 最终检查:如果
cnt == 3,说明恰好经历了'升 -> 降 -> 升'三个阶段,且没有多余的转折,返回true。
2. 完整代码
class Solution {
public boolean isTrionic(int[] nums) {
// 边界条件:数组长度过短无法形成三段
if (nums.length < 4) {
return false;
}
// 1. 检查起始段
// 必须以严格递增开始
if (nums[0] >= nums[1]) {
;
}
;
( ; i < nums.length; i++) {
(nums[i - ] == nums[i]) {
;
}
((nums[i - ] < nums[i - ]) != (nums[i - ] < nums[i])) {
cnt++;
}
}
cnt == ;
}
}

