334遞增的三元子串行(單調棧)

2021-10-18 06:31:01 字數 842 閱讀 5134

1、題目描述

給你乙個整數陣列 nums ,判斷這個陣列中是否存在長度為 3 的遞增子串行。

如果存在這樣的三元組下標 (i, j, k) 且滿足 i < j < k ,使得 nums[i] < nums[j] < nums[k] ,返回 true ;否則,返回 false 。

高階:你能實現時間複雜度為 o(n) ,空間複雜度為 o(1) 的解決方案嗎?

2、示例

輸入:nums = [2,1,5,0,4,6]

輸出:true

解釋:三元組 (3, 4, 5) 滿足題意,因為 nums[3] == 0 < nums[4] == 4 < nums[5] == 6

3、題解

基本思想:單調棧,維護長度為3的遞增棧,如果當前元素比棧頂大,入棧;否則當前元素替換掉棧中剛好比它大的元素;這樣替換的好處是並不影響遞增子串行的長度。和300最長上公升子串行思想一致。

為什麼對於當前遍歷nums的元素需要用它覆蓋掉棧中比它大於或等於的元素中第乙個元素?

比如序列[2,4,5,3,7]當遍歷到3時,棧中陣列元素是[2,4,5],需要用3覆蓋掉4,這樣做的意義是遞增子串行長度為2的所有序列中,最後乙個元素最小可以是3替換掉之前最小可以是4的情況

#include#include#include#include#includeusing namespace std;

class solution ;

for(int i=1;ires.back())

res.push_back(nums[i]);

else if(nums[i]nums;

cout

}

遞增三元子串行LeetCode334

題目 給定乙個未排序的陣列,判斷這個陣列中是否存在長度為 3 的遞增子串行.數學表示式如下 如果存在這樣的 i,j,k,且滿足 0 i j k n 1,使得 arr i arr j arr k 返回 true 否則返回 false 說明 要求演算法的時間複雜度為 o n 空間複雜度為 o 1 分析 ...

Leetcode 334 遞增的三元子串行

給定乙個未排序的陣列,判斷這個陣列中是否存在長度為 3 的遞增子串行。數學表示式如下 如果存在這樣的 i,j,k,且滿足 0 ij k n 1,使得 arr i arr j arr k 返回 true 否則返回 false 說明 要求演算法的時間複雜度為 o n 空間複雜度為 o 1 示例 1 輸入...

LeetCode 334 遞增的三元子串行

給定乙個未排序的陣列,判斷這個陣列中是否存在長度為 3 的遞增子串行。數學表示式如下 如果存在這樣的 i,j,k,且滿足 0 i j k n 1,使得 arr i arr j arr k 返回 true 否則返回 false 說明 要求演算法的時間複雜度為 o n 空間複雜度為 o 1 示例 1 輸...