我一直在努力解决 LeetCode 问题334。增加三元组子序列:
给定一个整数数组
nums
,返回true
是否存在一个三元组索引(i, j, k)
使得i < j < k
和nums[i] < nums[j] < nums[k]
。如果不存在这样的索引,则返回false
。[...]
跟进:您能否实现一个时间复杂度为 O(n),空间复杂度为 O(1)的解决方案?
因此数字不需要连续,但它们的索引需要排序;也就是说,[1,2,0,3]
由于有效所以为真[1,2,3]
,但[3,2,1]
为假。
在找到足够好的解决方案并通过测试并阅读已接受的解决方案后,我发现公认的最有效的解决方案是这样的:
var increasingTriplet = function (nums) {
let a = Infinity, b = Infinity, c = Infinity;
for (let i = 0; i < nums.length; i++) {
if (nums[i] <= a) a = nums[i];
else if (nums[i] <= b) b = nums[i];
else if (nums[i] <= c) {
return true;
}
}
return false;
}
虽然它确实通过了测试用例,但我不确定它是否正确。原因如下:考虑数组[20, 100, 10, 12, 5, 13]
。
[10, 12, 13]
由于满足条件,因此结果对于该输入应该为真。
该算法确实对该测试返回 true,但如果我们在成功时记录a
、b
和的值,它们是,这不是正确的解决方案,因为这三个数字在原始数组中是无序的。c
{ a: 5, b: 12, c: 13 }
可能发生以下两种情况之一:
- 该算法是错误的。
- 该算法仅仅验证所需子集的存在,但并未真正找到它。
我怀疑是后者,因为我无法构建一个算法给出错误结果的测试用例。但是,我无法理解为什么在像我所展示的那种情况下它保证是正确的。我还想知道返回正确子集的算法是否可以在 O(n) 时间和 O(1) 空间中工作。