【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)。

参考灵神

相关推荐
小O的算法实验室17 小时前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
郭涤生18 小时前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
༾冬瓜大侠༿18 小时前
vector
c语言·开发语言·数据结构·c++·算法
Ricky111zzz18 小时前
leetcode学python记录1
python·算法·leetcode·职场和发展
汀、人工智能18 小时前
[特殊字符] 第58课:两个正序数组的中位数
数据结构·算法·数据库架构··数据流·两个正序数组的中位数
liu****18 小时前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯
汀、人工智能18 小时前
[特殊字符] 第79课:分割等和子集
数据结构·算法·数据库架构·位运算·哈希表·分割等和子集
汀、人工智能18 小时前
[特殊字符] 第74课:完全平方数
数据结构·算法·数据库架构·图论·bfs·完全平方数
CoderCodingNo18 小时前
【GESP】C++四、五级练习题 luogu-P1177 【模板】排序
数据结构·c++·算法
Proxy_ZZ018 小时前
从零实现LDPC比特翻转译码器:C语言实战与底层逻辑解析
c语言·算法