无法排查LeetCode 334递增三元子序列解法问题,求解答
问题分析与解决方案
核心错误
你的代码逻辑存在根本性偏差:只检查了数组中连续的三个元素是否递增,但题目要求的是存在任意下标i<j<k(无需连续)满足nums[i]<nums[j]<nums[k]。
以测试用例nums=[20,100,10,12,5,13]为例,有效三元组是(2,3,5)(对应数值10<12<13),但这三个下标并不连续,所以你的代码无法检测到,最终错误返回false。
正确思路
我们可以通过维护两个变量first和second来高效解决这个问题:
first:记录遍历过程中遇到的最小数值second:记录遍历过程中,比first大的最小数值
遍历数组时:
- 如果当前元素小于等于
first,更新first为当前元素 - 如果当前元素大于
first但小于等于second,更新second为当前元素 - 如果当前元素大于
second,说明找到了满足条件的三元组,直接返回true
遍历结束后如果没找到,返回false
这种方法的时间复杂度是O(n),空间复杂度是O(1),能高效处理所有情况。
修正后的代码
class Solution { public boolean increasingTriplet(int[] nums) { if (nums.length < 3) { return false; } int first = Integer.MAX_VALUE; int second = Integer.MAX_VALUE; for (int num : nums) { if (num <= first) { first = num; } else if (num <= second) { second = num; } else { // 找到比second大的数,说明存在三元组 return true; } } return false; } }
验证测试用例
对于输入[20,100,10,12,5,13]:
- 遍历到20:
first更新为20 - 遍历到100:100>20且100<=MAX_VALUE,
second更新为100 - 遍历到10:10<=20,
first更新为10 - 遍历到12:12>10且12<=100,
second更新为12 - 遍历到5:5<=10,
first更新为5 - 遍历到13:13>12,触发返回true
完全符合预期结果。
内容的提问来源于stack exchange,提问作者AJ008
相关产品推荐
相关产品推荐

