题目描述
给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列。
数学表达式如下:
如果存在这样的 i, j, k, 且满足 0 ≤ i < j < k ≤ n-1,
使得 arr[i] < arr[j] < arr[k] ,返回 true ; 否则返回 false 。
说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1) 。
示例 1:
输入: [1,2,3,4,5] 输出: true
示例 2:
输入: [5,4,3,2,1] 输出: false
问题分析
设两个变量first_min和second_min,它们分别代表数组中到当前遍历位置第一小的数和第二小的数。然后从前往后遍历数组,把遇到的数先与first_min比较,若小于等于它,则将first_min置为该数,保证了first_min一定是数组从头到现在遍历位置最小的数;如果遇到的数大于first_min,那么把它与second_min比较,如果小于等于它,则将second_min置为该数;如果遇到的数大于second_min,那么直接返回true。当数组遍历结束时仍没有返回true,那么返回false。
代码实现
class Solution {
public:
bool increasingTriplet(vector<int>& nums) {
int first_min = INT_MAX;
int second_min = INT_MAX;
for(int i : nums){
if(i <= first_min)
first_min = i;
else if(i <= second_min)
second_min = i;
else
return true;
}
return false;
}
};