这题挺有意思,主要是要找出是否有3个元素递增,这3个元素的索引必须依次增加但是不要求临近。首先贴题目:

Given an unsorted array return whether an increasing subsequence of length 3 exists or not in the array.

Formally the function should:

Return true if there exists i, j, k 
such that arr[i] < arr[j] < arr[k] given 0 ≤ i < j < k ≤ n-1 else return false.
Note: Your algorithm should run in O(n) time complexity and O(1) space complexity.

Example 1:

Input: [1,2,3,4,5]
Output: true
Example 2:

Input: [5,4,3,2,1]
Output: false

这题的事件复杂度要求是O(N),空间复杂度要求为O(1),所以我们无法暴力搜索。这题可以简化为是否能找出第三个最小值。我们首先定义变量min1与min2,分别表示最小值,第二小值,然后依次遍历数组。假设遍历到的值是比min1和min2更小的值,那么我们更新min1的值;假设遍历到比min2还小的值,那么更新min2,更新的时候也代表了min1被更新过了,也就是之前肯定有数字比当前值更加小;当遍历到比min1和min2更大的数字的时候,就表示在当前值前已经存在了至少2个数比它更小了,于是就表示这个数组是满足条件的。下面贴代码:

bool increasingTriplet(vector<int>& nums) {
    int min1 = INT_MAX, min2 = INT_MAX;
    for (auto v : nums) {
        if (v <= min1 && v <= min2) {
            min1 = v;
        } else if (v <= min2) {
            min2 = v;
        } else {
            return true;
        }
    }
    return false;
}
共 0 条回复
暂时没有人回复哦,赶紧抢沙发
发表新回复

作者

sryan
today is a good day