刷过LeetCode的人大概都遇到过这种情况:题目标着"Easy",点进去发现边界条件比主逻辑还复杂。第414题"Third Maximum Number"就是典型——看似只是找第三大的数,但"distinct"这个限定词让事情变得微妙起来。

题目要求很明确:给定整数数组,返回第三大的不同数字。如果不存在第三大的不同数字,就返回最大值。示例很直观:[3,2,1]返回1,[1,2]因为只有两个不同数字,返回2。但实现时很多人栽在同一个坑里:数组下标从0开始,长度从1开始,这个基础概念在边界判断时特别容易混淆。

打开网易新闻 查看精彩图片

最直观的解法是用排序加去重。先把数组升序排列,再用stream的distinct操作过滤重复元素,转成新数组。这时候逻辑就清晰了:去重后的数组长度小于3,直接返回最后一个元素(即最大值);长度大于等于3,返回倒数第三个元素。时间复杂度O(nlogn),空间复杂度O(n),对于Easy题目完全够用。

打开网易新闻 查看精彩图片

代码实现很简洁。Arrays.sort处理排序,Arrays.stream配合distinct和toArray完成去重转换。核心判断只有两行:uniqueArr.length小于3时返回uniqueArr[uniqueArr.length-1],否则返回uniqueArr[uniqueArr.length-3]。这里没有遍历找最大值的繁琐,也没有维护三个变量的复杂状态机,而是利用排序后的有序性直接定位。

这种思路的代价是额外的空间开销。如果追求O(1)空间,可以用三指针法遍历一次数组,维护first、second、third三个变量,遇到更大的数就逐级替换。但代码复杂度会显著上升,需要处理重复值的跳过逻辑和初始值的边界情况。面试场景下,先写出清晰正确的排序解法,再讨论优化空间,往往是更稳妥的策略。

打开网易新闻 查看精彩图片

这道题的真正价值在于提醒我们:算法题的难度标签不代表思维难度,而是代码复杂度。Easy题考察的是对问题本质的理解和边界条件的把控,而非炫技式的优化。当你下次看到"简单"标签时,不妨多留个心眼——那些藏在细节里的陷阱,才是出题人真正想测试的东西。