LeetCode算法题(Go语言实现)_08

题目

给你一个整数数组 nums ,判断这个数组中是否存在长度为 3 的递增子序列。

如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k ,使得 nums[i] < nums[j] < nums[k] ,返回 true ;否则,返回 false 。

一、代码实现

go 复制代码
func increasingTriplet(nums []int) bool {
    first := math.MaxInt32
    second := math.MaxInt32
    
    for _, num := range nums {
        if num <= first {        // 更新最小值
            first = num
        } else if num <= second { // 更新次小值
            second = num
        } else {                // 找到第三大的值
            return true
        }
    }
    return false
}

二、算法分析

1. 核心思路

贪心策略 :维护两个变量 firstsecond,分别表示当前找到的最小值和次小值。遍历时,若发现比 second 大的元素,则存在递增三元子序列。

关键性质 :通过不断更新更小的 firstsecond,最大化后续找到更大值的可能性。例如,当遇到 5 时,若后续有 46,更新 first 为更小的值不影响已存在的有效 second

2. 关键步骤
  1. 初始化firstsecond 设为最大整数。
  2. 遍历数组
    • 若当前数 ≤ first,更新 first(保证最小值尽可能小)。
    • 若当前数 > first 但 ≤ second,更新 second
    • 若当前数 > second,直接返回 true
3. 复杂度

时间复杂度O(n),仅需一次遍历。

空间复杂度O(1),仅使用两个变量。

三、图解

四、边界条件与扩展

1. 边界条件

数组长度 ❤️ :直接返回 false

全递减数组 :如 [5,4,3,2,1],无法找到三元组。

多个相同元素 :如 [1,1,1],不满足严格递增。

2. 扩展方法

动态规划 :记录每个位置左侧最小值和右侧最大值,时间复杂度 O(n),空间复杂度 O(n)

双向遍历:预先计算每个元素的左边最小值和右边最大值,需两次遍历。

五、总结

核心优势 :贪心算法以 O(1) 空间实现高效判断,通过维护最小候选值降低后续匹配难度。

关键证明 :若存在递增三元组,则在遍历过程中一定会被贪心策略捕获。即使 first 更新到较后位置,已记录的 second 仍隐含前面存在更小值。

适用场景:适用于需要高效检测递增模式的场景,如实时数据流分析。

相关推荐
派大星~课堂几秒前
【力扣-19. 删除链表的倒数第n个节点 ✨】Python笔记
python·leetcode·链表
memcpy04 分钟前
LeetCode 1208. 尽可能使字符串相等【不定长滑窗,字符串】1497
算法·leetcode·职场和发展
阿Y加油吧6 分钟前
LeetCode 二叉树双王炸!二叉树展开为链表 + 前序 + 中序还原二叉树|小白递归一把过
算法·leetcode·链表
AI科技星9 分钟前
全球AI信息场(信息网)基础理论与数学建模研究(乖乖数学)
开发语言·人工智能·线性代数·算法·机器学习·数学建模
仟濹17 分钟前
【算法打卡day37(2026-04-04 周六)】DFS专项训练4-枚举专项训练 1-全部是蓝桥杯真题
算法·蓝桥杯·深度优先
汀、人工智能21 分钟前
12 - 内置函数:Python的瑞士军刀
数据结构·算法·数据库架构·图论·python的瑞士军刀
Tisfy33 分钟前
LeetCode 3418.机器人可以获得的最大金币数:动态规划
leetcode·机器人·动态规划
羊小猪~~1 小时前
LLM--微调(Adapters,Prompt,Prefix)
算法·ai·大模型·llm·prompt·adapters·prefix
未来之窗软件服务1 小时前
SenseVoicecpp ggml-hexagon.cpp大模型[AI人工智能(七十九)]—东方仙盟
人工智能·算法·仙盟创梦ide·东方仙盟
xiaoye-duck1 小时前
《算法题讲解指南:动态规划算法--子数组系列》--25.单词拆分,26.环绕字符串中唯一的子字符串
c++·算法·动态规划