【Leetcode解題】334. Increasing Triplet Subsequence
題目
- 題目連結
- 目標函式 :
increasingTriplet(nums)- Input :
nums: List[int] - Output :
bool
- Input :
解題概念
- 題意 :
- 給予一陣列
nums,如果滿足以下條件 :i < j < knums[i] < nums[j] < nums[k]
- 則回傳
True,否則回傳False
- 給予一陣列
我的寫法
- 想法 :
- 用三重
for迴圈,分別針對i,j,i:- 若滿足
nums[i] < nums[j] and nums[j] < nums[k],直接回傳True
- 若滿足
- 若迴圈結束,代表找不到,則回傳
False
- 用三重
- 程式碼 :
1
2
3
4
5
6
7
8if len(nums) < 3:
return False
for i in range(0, len(nums)-2):
for j in range(i, len(nums)-1):
for k in range(j, len(nums)):
if nums[i] < nums[j] and nums[j] < nums[k]:
return True
return False - 成效 : Runtime Error
- 因為此算法之時間複雜度為 $O(n^3)$
解答 or 其他優秀寫法
- 想法 :
left存放目標的nums[i]、mid存放目標的nums[j]- 透過
for迴圈針對每個num,會有三種狀況 :- 若
num > mid,代表有一數大於left與mid,已滿足題目所求,故直接回傳True - 若
num > left and num < mid,代表有一數介於left與mid之間,故把該值設為mid(希望後續能找到比該值更大的nums[k]) - 若
num < left,代表有一數小於left與mid,故把該值設為left(希望後續能找到比該值更大的nums[j]與nums[k])
- 若
- 程式碼 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14if len(nums) < 3:
return False
left = 2 ^ 32
mid = 2 ^ 32
for num in nums:
if num > mid:
return True
elif num > left and num < mid:
mid = num
elif num < left:
left = num
return False - 成效 :
- Runtime: 781 ms (faster than 62.76%)
- Memory Usage: 22.9 M (less than 51.86%)
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Robin's Tech Blog!


