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

题目

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

如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k ,使得 numsi < numsj < numsk ,返回 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. 核心思路

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

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

2. 关键步骤
  1. 初始化 :first 和 second 设为最大整数。
  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 仍隐含前面存在更小值。

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

相关推荐
紧跟先前的步伐5 小时前
Go AI Agent 实战 24|工具系统工程化收尾与阶段验收
人工智能·ai·golang·1024程序员节
日日大王学编程6 小时前
#Feed 流项目复盘:Redis 时间线缓存与 Outbox 消息可靠性设计
golang·1024程序员节
Yuzhiyuxia7 小时前
【AI Agent面试系列】AI Agent记忆机制知识点1
人工智能·面试·职场和发展
UIU1147 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
论文复现现场7 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi7 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
秋天的怀念_David9 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
碧海银沙音频科技研究院9 小时前
在PC电脑上用Whisper→Marian算法实现离线语音翻译功能
算法·whisper
niyongsheng10 小时前
3D 装箱算法工程化:数据结构、放置启发式与支撑规则
数据结构·算法·rust
j7~12 小时前
【穷举、深搜与回溯算法】一棵决策树讲透全排列与子集
数据结构·c++·算法·leetcode·回溯·递归