1. 程式人生 > 其它 >334. 遞增的三元子序列

334. 遞增的三元子序列

技術標籤:LeetCode陣列解題思想-雙指標leetcode資料結構

1.題目描述

給你一個整數陣列 nums ,判斷這個陣列中是否存在長度為 3 的遞增子序列。如果存在這樣的三元組下標 (i, j, k) 且滿足 i < j < k ,使得 nums[i] < nums[j] < nums[k] ,返回 true ;否則,返回 false 。
示例 1:
在這裡插入圖片描述
示例 2:
在這裡插入圖片描述
示例 3:
在這裡插入圖片描述
提示:
1 <= nums.length <= 105
-2^31 <= nums[i] <= 2^31 - 1

2.方法一

最長上升子序列,然後判斷子序列的長度是否大於等於3

3.方法二(雙指標)

1.設定兩個變數 small 和 mid ,分別用來儲存長度為 3 的遞增子序列的最小值和中間值。
2.遍歷陣列並和 small 和 mid 相比,若小於等於 small ,則替換 small;否則,若小於等於 mid,則替換 mid;否則,若大於 mid,則說明我們找到了長度為 3 的遞增陣列!
證明:
1.假如當前的 small 和 mid 為 [3, 5],這時又來了個 1。如果不將 small 替換為 1,那麼,當下一個數字是 2,後面再接上一個 3 的時候,我們就沒有辦法發現這個 [1,2,3] 的遞增陣列了!也就是說,我們替換最小值,是為了後續能夠更好地更新中間值!

2.即使更新了 small ,這個 small 在 mid 後面,沒有嚴格遵守遞增順序,但它隱含著的真相是,有一個比 small 大比 mid 小的前·最小值出現在 mid 之前。因此,當後續出現比 mid 大的值的時候,我們一樣可以通過當前 small 和 mid 推斷的確存在著長度為 3 的遞增序列

4.程式碼

class Solution {
public:
    bool increasingTriplet(vector<int>& nums) {
        int len = nums.size();
        if(len <
3){ return false; } int small = INT_MAX; int mid = INT_MAX; for(auto &num : nums){ if(num <= small){ small = num; } else if(num <= mid){ mid = num; } else{ return true; } } return false; } };

5.複雜度分析

時間複雜度:O(n)
空間複雜度:O(1)