334. Increasing Triplet Subsequence

正常DP代码,但是在一个实例上超时了,==,要去找找可以节约时间的方法了。

class Solution {
public:
    bool increasingTriplet(vector<int>& nums) {
        if(nums.size()<=2)
            return false;

        vector<int> dp(nums.size(),1);
        for(int i=nums.size()-2;i>=0;i--)
        {
            for(int j=i+1;j<nums.size();j++)
            {
                if(nums[i]<nums[j])
                    dp[i]=max(dp[i],1+dp[j]);
            }
            if(dp[i]>=3)
                return true;
        }
        return false;
    }
};

最终AC代码,我的天那,提交了5次,终于AC了。。。。艰辛,中间遇到各种问题。比如int超范围啦。。。但是看提交结果差强人意啊,是要看看discuss了。

class Solution {
public:
    bool increasingTriplet(vector<int>& nums) {
        if(nums.size()<=2)
            return false;

        multimap<int,int> count;
        count.insert(std::pair<int,int>(nums.back(),nums.size()-1));

        vector<int> dp(nums.size(),1);
        for(int i=nums.size()-2;i>=0;i--)
        {
            count.insert(std::pair<int,int>(nums[i],i));
            for(multimap<int,int>::iterator it=count.lower_bound(nums[i]);it!=count.end();it++)
                if(it->first>nums[i])
                    dp[i]=max(dp[i],1+dp[it->second]);

            if(dp[i]>=3)
                return true;
        }
        return false;
    }
};

参考discuss,厉害了,原理大神们没有用DP,而是直接用两个元素存储。

class Solution {
public:
    bool increasingTriplet(vector<int>& nums) {
        if(nums.size()<=2)
            return false;

        int c1=INT_MAX;
        int c2=INT_MAX;

        for(int i=0;i<nums.size();i++)
        {
            if(nums[i]<=c1)
                c1=nums[i];
            else if(nums[i]<=c2)
                c2=nums[i];
            else
                return true;
        }

        return false;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值