334. Increasing Triplet Subsequence

題目翻譯:

給定一個未排序的數組,返回數組中是否存在長度爲3的遞增子序列(不一定要連續)

舉例:

返回true,如果存在I,J,K 使得,ARR [I] < ARR [J]. < ARR [K] 給定的0 ≤ I < J < K ≤ N ,
否則返回false。

你的算法應該運行在O(N)的時間複雜度,O(1)的空間複雜度。

實例:
給定[ 1,2,3,4,5 ]
return true。

給定[ 5,4,3,2,1 ]
returnfalse


分析:DONE

最長上升子串的變形,遇到上升子串長度爲3即可停止。但是這裏限定了複雜度就麻煩了!

動態規劃來做(可以AC,但不符合要求):

class Solution {
public:
    bool increasingTriplet(vector<int>& nums) {
        if(nums.size() < 3)  
            return false;  
        int maxLen=1;  
        vector<int> dp(nums.size(),1);  
        for(int i=1;i<nums.size();i++)  {    
            for(int j=0;j<i;j++)  {
               if(nums[i]>nums[j] && dp[j]+1 > dp[i])  {   
                   dp[i]=dp[j]+1;  
                   if(maxLen < dp[i])  
                        maxLen = dp[i];  
                   if(maxLen == 3)
                        return true;
                }  
            }
        }
        return false;
    }
};




別人的答案:

完全符合題目要求,

1)從頭開始遍歷,並用min記錄最小值,secondmin記錄次最小值
2)當min和secondmin都找到時,只要存在一個新的值大於這兩個值,那麼就存在遞增的三元子串。
3)特別的,例如[1, 2, 0, 4] 在遍歷時,min可能會變成0,但是沒關係,min和secondmin的最大值仍爲secondmin,依然可以用於判斷,且之前存在oldmin(先前的min)和secondmin之間的遞增序列。

class Solution {
public:
    //具有較強技巧性,不好想。沒什麼意思!
    bool increasingTriplet(vector<int>& nums) {
        if(nums.size() < 3)  
            return false;  
        int min=INT_MAX;
        int second=INT_MAX;
        for(int i=0;i<nums.size();i++)  {    
            if(nums[i] <= min)//必須是等號
                min=nums[i];//記錄最小值
            else if(nums[i] <= second)
                second=nums[i];//記錄次小值
            else//說明存在
                return true;
        }
        return false;
    }
};


注:本博文爲EbowTang原創,後續可能繼續更新本文。如果轉載,請務必複製本條信息!

原文地址:http://blog.csdn.net/ebowtang/article/details/51674344

原作者博客:http://blog.csdn.net/ebowtang

本博客LeetCode題解索引:http://blog.csdn.net/ebowtang/article/details/50668895

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章