334. 遞增的三元子序列
阿新 • • 發佈:2021-02-10
技術標籤: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] 的遞增陣列了!也就是說,我們替換最小值,是為了後續能夠更好地更新中間值!
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)