Python中線性時間內查詢大小為3的有序子序列
假設我們有一個包含N個數字的陣列,我們必須檢查是否存在3個元素,使得b[i]< b[j] < b[k] 且 i < j < k,時間複雜度為線性(O(n))。如果存在多個這樣的三元組,則列印其中任何一個。
因此,如果輸入類似於[13, 12, 11, 6, 7, 3, 31],則輸出將為[6,7,31]
為了解決這個問題,我們將遵循以下步驟:
- n := A的大小
- 最大值 := n-1,最小值 := 0
- smaller := 一個大小為1000的陣列,並填充0
- smaller[0] := -1
- 對於範圍從1到n的i,執行:
- 如果A[i] <= A[最小值],則
- 最小值 := i
- smaller[i] := -1
- 否則,
- smaller[i] := 最小值
- 如果A[i] <= A[最小值],則
- greater := 一個大小為1000的陣列,並填充0
- greater[n-1] := -1
- 對於範圍從n-2到-1的i,遞減1,執行:
- 如果A[i] >= A[最大值],則
- 最大值 := i
- greater[i] := -1
- 否則,
- greater[i] := 最大值
- 如果A[i] >= A[最大值],則
- 對於範圍從0到n的i,執行:
- 如果smaller[i]不等於-1且greater[i]不等於-1,則
- 返回A[smaller[i]], A[i], A[greater[i]]
- 如果smaller[i]不等於-1且greater[i]不等於-1,則
- 返回"Nothing"
示例
讓我們看看下面的實現以更好地理解:
def find_inc_seq(A): n = len(A) maximum = n-1 minimum = 0 smaller = [0]*10000 smaller[0] = -1 for i in range(1, n): if (A[i] <= A[minimum]): minimum = i smaller[i] = -1 else: smaller[i] = minimum greater = [0]*10000 greater[n-1] = -1 for i in range(n-2, -1, -1): if (A[i] >= A[maximum]): maximum = i greater[i] = -1 else: greater[i] = maximum for i in range(0, n): if smaller[i] != -1 and greater[i] != -1: return A[smaller[i]], A[i], A[greater[i]] return "Nothing" arr = [13, 12, 11, 6, 7, 3, 31] print(find_inc_seq(arr) )
輸入
[13, 12, 11, 6, 7, 3, 31]
輸出
(6, 7, 31)
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP