📘 題目敘述
給你一個長度為 n 的整數陣列 nums。
如果存在索引 0 < p < q < n - 1 使得:
nums[0...p]嚴格遞增nums[p...q]嚴格遞減nums[q...n-1]嚴格遞增
則稱這個陣列是 trionic。
請回傳 nums 是否為 trionic。
條件限制
3 <= n <= 100-1000 <= nums[i] <= 1000
🧠 解題思路
我用一次線性掃描去判斷整段是否符合「遞增 → 遞減 → 遞增」三段式,並且用三個布林值記錄目前走到哪一段。
掃描時每一步只看相鄰兩個數 nums[i-1] 和 nums[i]:
- 第一段(嚴格遞增):
- 只要目前還沒進入第二段,就允許一直
nums[i-1] < nums[i] - 有出現過遞增就把
check1 = true
- 只要目前還沒進入第二段,就允許一直
- 第二段(嚴格遞減):
- 必須先有第一段(
check1 == true)才允許進入 - 只要第三段還沒開始,就允許一直
nums[i-1] > nums[i] - 有出現過遞減就把
check2 = true
- 必須先有第一段(
- 第三段(嚴格遞增):
- 一旦開始(遇到
nums[i-1] < nums[i]且已經不在第一段的規則內),就把check3 = true - 第三段開始後如果又出現
<=或需要回到遞減,直接判定失敗
- 一旦開始(遇到
- 其他情況(包含相等、或不符合段落順序的變化)
- 直接回傳
false
- 直接回傳
最後必須三段都真的出現過(check1 && check2 && check3)才回傳 true。
所有變數
nums:輸入陣列check1:是否已經出現過「第一段嚴格遞增」check2:是否已經出現過「第二段嚴格遞減」check3:是否已經出現過「第三段嚴格遞增」
🪜 主要流程步驟
1. 初始化三個段落的出現狀態
check1 = falsecheck2 = falsecheck3 = false
2. 從左到右掃描相鄰關係(一次走完)
對每個 i = 1 ... n-1:
- 情況 A:
nums[i-1] < nums[i]且還沒進入第二段(!check2)- 代表還在第一段嚴格遞增
check1 = true
- 情況 B:
nums[i-1] > nums[i]且已經有第一段(check1)且第三段還沒開始(!check3)- 代表在第二段嚴格遞減
check2 = true
- 情況 C:
nums[i-1] < nums[i](不符合情況 A 時才會走到這裡)- 代表進入/維持第三段嚴格遞增
check3 = true
- 其他情況(包含相等、或不符合段落順序的變化)
- 直接回傳
false
- 直接回傳
3. 檢查三段是否都成立
- 如果
check1 && check2 && check3為真,回傳true - 否則回傳
false
💻 程式碼實作
class Solution {
public:
bool isTrionic(vector<int>& nums) {
bool check1 = false;
bool check2 = false;
bool check3 = false;
for (int i = 1; i < nums.size(); i++) {
if (nums[i - 1] < nums[i] && !check2) {
check1 = true;
} else if (nums[i - 1] > nums[i] && check1 && !check3) {
check2 = true;
} else if (nums[i - 1] < nums[i]) {
check3 = true;
} else {
return false;
}
}
if (check1 && check2 && check3) {
return true;
} else {
return false;
}
}
};
🔗 題目連結
https://leetcode.com/problems/trionic-array-i/