遞增三元子串行LeetCode334

2021-08-26 20:18:09 字數 1814 閱讀 5523

題目:

給定乙個未排序的陣列, 判斷這個陣列中是否存在長度為 3 的遞增子串行. 數學表示式如下:

如果存在這樣的 

i, j, k,  且滿足 0 ≤

i<

j<

k ≤

n-1,

使得 arr[i]

<

arr[j]

<

arr[k] ,返回 true ; 否則返回 false 。

說明:

要求演算法的時間複雜度為 o(n),空間複雜度為 o(1) 。

分析:

時間複雜度為o(n), 也就是不能在遍歷時對每個元素都分析整個序列的前後元素的情況, 必定要有一種狀態可以在元素之間相互轉移;

空間複雜度為o(1), 說明不能再新建立 狀態儲存陣列 或者其他之類的東西

突破點:

任何兩個相鄰的元素都有大小關係, 而且這種大小關係可以轉移

思路:

設計四個指標p[1] ~ p[4],然後來乙個外層迴圈 while(true)

1,先找到第乙個連續遞增二元子串行(比如【3,1,2,7】中【1,2】就是第乙個連續遞增二元子串行)。

可以發現之前的那個3沒有任何用處。

2,然後看下乙個元素也就是p[3],這裡要分情況討論

①如果p[3] > p[2],查詢成功

②否則若p[2] >= p[3] > p[1],想法同第 1 步,可以發現p[2]沒用了,直接讓p[2] = p[3],然後繼續迴圈

③否則若p[3] <= p[1],這裡需要再次分情況討論,討論p[3]的下乙個元素p[4],需要注意的是下面的所有情況中p[3]永遠小於等於前面的兩個元素

1)若p[4] > p[2],查詢成功,即p[1] < p[2] < p[4]

2)否則若p[2] > p[4] > p[3],發現 p[3] < p[1] 和 p[4] < p[2] 且p[3], p[4]是乙個新的二元遞增子串行,思路仍然同第  1 步,前面的p[1]和p[2]沒有任何用處了,直接讓p[1] = p[3], p[2] = p[4],然後繼續迴圈

3)否則p[4] < p[3],思路同第 1 步,可以發現p[3]沒有任何用處,直接讓p[3] = p[4],然後繼續迴圈

**:

const auto _nouse = ()();

class solution

; while (max(max(p[1], p[2]), p[3]) < size)

if (p[3] >= size)

return false;

if (nums[p[3]] > nums[p[2]])

if (nums[p[3]] > nums[p[1]])

p[4] = p[3] + 1;

if (p[4] >= size)

return false;

if (nums[p[4]] > nums[p[2]])

if (nums[p[4]] > nums[p[3]])

p[3] = p[4];

p[4]++;

}return false;

}};

細節, 比如越界檢查和如何返回之類的注意一下就行

提交後, 耗時4ms, 戰勝99.27%的c++**. 不過例子裡很多都用的不是o(n)的時間複雜度和o(1)的空間複雜度. 這個需要到時候按情況取捨.要想出完美的答案必定要耗費很多時間

遞增三元子串行

如果存在這樣的 i,j,k,且滿足 0 i j k n 1 使得 arr i arr j arr k 返回 true 否則返回 false 說明 要求演算法的時間複雜度為 o n 空間複雜度為 o 1 示例 1 輸入 1,2,3,4,5 輸出 true 示例 2 輸入 5,4,3,2,1 輸出 fa...

LeetCode 遞增的三元子串行

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

LeetCode 遞增的三元子串行

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