สมมติว่าเรามีอาร์เรย์ที่มี N ตัวเลข เราต้องตรวจสอบว่ามี 3 องค์ประกอบที่ทำให้ b[i] < b[j] < b[k] และ i < j < k ในเวลาเชิงเส้น (O(n)) หากมีทริปเล็ตหลายชุด ให้พิมพ์ชุดใดชุดหนึ่ง
ตัวอย่าง
หากอินพุตคือ [13, 12, 11, 6, 7, 3, 31] ผลลัพธ์จะเป็น [6, 7, 31]
ขั้นตอนการแก้ปัญหา
n:= ขนาดของAmaximum:=n-1,minimum:= 0smaller:= อาร์เรย์ขนาด 1000 เติมด้วย 0,smaller[0] := -1- ลูป
iจาก 1 ถึงn:- ถ้า
A[i] <= A[minimum]ให้minimum := iและsmaller[i] := -1 - อื่นๆ ให้
smaller[i] := minimum
- ถ้า
greater:= อาร์เรย์ขนาด 1000 เติมด้วย 0,greater[n-1] := -1- ลูป
iจากn-2ถึง -1 ลดทีละ 1:- ถ้า
A[i] >= A[maximum]ให้maximum := iและgreater[i] := -1 - อื่นๆ ให้
greater[i] := maximum
- ถ้า
- ลูป
iจาก 0 ถึงn:- ถ้า
smaller[i] != -1และgreater[i] != -1ให้คืนค่าA[smaller[i]], A[i], A[greater[i]]
- ถ้า
- คืนค่า "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)