題目:
給定乙個未排序的陣列, 判斷這個陣列中是否存在長度為 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 輸...