【LeetCode 每日一题】3637. 三段式数组 I——(解法二)一次循环

Problem: 3637. 三段式数组 I

文章目录

  • [1. 整体思路](#1. 整体思路)
  • [2. 完整代码](#2. 完整代码)
  • [3. 时空复杂度](#3. 时空复杂度)
      • [时间复杂度: O ( N ) O(N) O(N)](#时间复杂度: O ( N ) O(N) O(N))
      • [空间复杂度: O ( 1 ) O(1) O(1)](#空间复杂度: O ( 1 ) O(1) O(1))

1. 整体思路

核心问题

我们需要验证数组是否为 升 -> 降 -> 升 的形状。

这个形状特征可以转化为单调性的变化次数

  1. 开始 :必须是上升的 (up)。
  2. 转折点 1 (峰) :从 变为
  3. 转折点 2 (谷) :从 变为
  4. 结束:必须保持上升状态直到结束,不能再有转折点。

这意味着,整个数组应该恰好包含 2 个转折点 ,或者说包含 3 个单调区间 (升、降、升)。

算法逻辑

  1. 初始检查nums[0] >= nums[1]。如果开头不是上升的,直接返回 false
  2. 计数器 cnt:初始化为 1,代表这是第 1 个单调区间(初始的上升段)。
  3. 遍历 :从 i = 2 开始遍历到末尾。
    • 平坡检查 :如果 nums[i-1] == nums[i],说明有平坡,不符合严格单调性,返回 false
    • 转折点检测
      • nums[i-2] < nums[i-1]:前一步是上升。
      • nums[i-1] < nums[i]:当前步是上升。
      • 如果这两个状态不一致(例如前一步升,当前步降;或前一步降,当前步升),说明发生了转折。
      • 发生转折时,区间计数 cnt++
  4. 最终检查 :如果 cnt == 3,说明恰好经历了"升 -> 降 -> 升"三个阶段,且没有多余的转折,返回 true

2. 完整代码

java 复制代码
class Solution {
    public boolean isTrionic(int[] nums) {
        // 边界条件:数组长度过短无法形成三段
        if (nums.length < 4) {
             return false;
        }

        // 1. 检查起始段
        // 必须以严格递增开始
        if (nums[0] >= nums[1]) {
            return false;
        }

        // cnt 记录单调区间的数量
        // 初始为 1,因为我们已经确认了开头是上升区间
        int cnt = 1;
        
        // 2. 遍历数组,检测转折点
        for (int i = 2; i < nums.length; i++) {
            // 严格单调性检查:不允许相等元素(平坡)
            if (nums[i - 1] == nums[i]) {
                return false;
            }
            
            // 核心逻辑:检测单调性是否改变
            // condition1: nums[i-2] < nums[i-1] (前一步是上升吗?)
            // condition2: nums[i-1] < nums[i]   (当前步是上升吗?)
            // 如果两个条件真假不同 (即 !=),说明单调性发生了反转 (峰或谷)
            if ((nums[i - 2] < nums[i - 1]) != (nums[i - 1] < nums[i])) {
                cnt++;
            }
        }
        
        // 3. 最终校验
        // cnt == 3 意味着经历了: 上升(1) -> 峰转折 -> 下降(2) -> 谷转折 -> 上升(3)
        // 且最后没有再转折,保持上升直到结束
        return cnt == 3;
    }
}

3. 时空复杂度

假设数组 nums 的长度为 N N N。

时间复杂度: O ( N ) O(N) O(N)

  • 计算依据
    • 代码包含一次 for 循环,从 2 遍历到 N N N。
    • 循环内部只包含常数次比较和自增操作。
  • 结论 : O ( N ) O(N) O(N)。

空间复杂度: O ( 1 ) O(1) O(1)

  • 计算依据
    • 只使用了常数个整型变量 (cnt, i)。
  • 结论 : O ( 1 ) O(1) O(1)。

参考灵神

相关推荐
野生技术架构师2 小时前
金三银四面试总结篇,汇总 Java 面试突击班后的面试小册
java·面试·职场和发展
_深海凉_2 小时前
LeetCode热题100-寻找两个正序数组的中位数
算法·leetcode·职场和发展
ja哇3 小时前
大厂面试高频八股
java·面试·职场和发展
踩坑记录3 小时前
leetcode hot100 寻找两个正序数组的中位数 hard 二分查找 双指针
leetcode
旖-旎3 小时前
深搜练习(电话号码字母组合)(3)
c++·算法·力扣·深度优先遍历
谭欣辰3 小时前
C++快速幂完整实战讲解
算法·决策树·机器学习
Mr_pyx3 小时前
【LeetHOT100】随机链表的复制——Java多解法详解
算法·深度优先
AIFarmer4 小时前
【无标题】
开发语言·c++·算法
AGV算法笔记4 小时前
CVPR 2025 最新感知算法解读:GaussianLSS 如何用 Gaussian Splatting 重构 BEV 表示?
算法·重构·自动驾驶·3d视觉·感知算法·多视角视觉
勤劳的进取家5 小时前
数据链路层基础
网络·学习·算法