LeetCode 334. 递增的三元子序列

题目描述

给定一个未排序的数组,判断这个数组中是否存在长度为 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;
    }
};

猜你喜欢

转载自blog.csdn.net/mengyujia1234/article/details/89525201