贪心——递增的三元子序列

原题在这里

概述题意:

  在给定数组中,能否找到任意一组元素,下标和值都递增。

这个题我是被三元组给忽悠了,觉得很难,所以直接pass

然后后悔

解法一:

  双向遍历,由于只需要找三个,那么从中间元素考虑,左边和右边分别维护最小最大值

    对于维护过程也是只需要两次遍历即可,那么final即为O(3n),甚至可以进一步优化为O(2n)

class Solution
{
public:
    bool increasingTriplet(vector<int> &nums)
    {
        int l = nums.size();
        vector<int> mx(nums), mi(nums);
        //维护最小值从左到右
        for (int i = 1; i < l; ++i)
            mi[i] = min(mi[i], mi[i - 1]);
        //维护最大值从右到左
        for (int i = l - 2; i >= 0; --i)
        {
            mx[i] = max(mx[i], mx[i + 1]);
            if (mi[i] < nums[i] && nums[i] < mx[i])
                return true;
        }
        return false;
    }
};
View Code

 

解法二:

  贪心,一次遍历(伪码如下)

    预定义x=nums[0],y=int_max,遍历过程:

      如果找到元素z有y<z,那么return true;

      否则或者z>x,y=z

      否则,x=z

    出循环 return false

    如此贪心遍历完成即是。

code:

class Solution
{
public:
    bool increasingTriplet(vector<int> &nums)
    {
        int l = nums.size(), x = nums[0], y = 0x7fffffff;
        for (int i = 1; i < l; ++i)
        {
            int z = nums[i];
            if (z > y)
                return true;
            else if (z > x)
                y = z;
            else
                x = z;
        }
        return false;
    }
};
View Code

 

posted @ 2022-03-17 19:01  Renhr  阅读(35)  评论(0)    收藏  举报