กำหนดให้มีลิสต์ตัวเลขชื่อ nums ต้องตรวจสอบว่ามี triplet (i, j, k) ที่ทำให้ i < j < k และ nums[i] < nums[k] < nums[j] หรือไม่
ตัวอย่าง
Input: nums = [2, 12, 1, 4, 4]
Output: True เพราะ [2, 12, 4] ตรงเงื่อนไข 2 < 4 < 12
อัลกอริทึม
- สร้างอาร์เรย์
leftขนาด n โดยleft[i]= ค่าต่ำสุดตั้งแต่ต้นถึง i - ใช้ Stack เก็บค่าจากขวาไปซ้าย
- วนจากขวาไปซ้าย ตรวจสอบเงื่อนไข
left[i-1] < nums[i]และnums[i] > stack.top() - ถ้าเจอ ให้คืนค่า true
โค้ดตัวอย่าง (C++)
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool solve(vector<int>& nums) {
int n = nums.size();
vector<int> left(n);
left[0] = nums[0];
for (int i = 1; i < n; i++) {
left[i] = min(nums[i], left[i - 1]);
}
stack<int> st;
for (int i = n - 1; i >= 1; i--) {
int x = left[i - 1];
while (!st.empty() && st.top() <= x)
st.pop();
if (!st.empty() && x < nums[i] && nums[i] > st.top())
return true;
st.push(nums[i]);
}
return false;
}
};
bool solve(vector<int>& nums) {
return (new Solution())->solve(nums);
}
int main() {
vector<int> v = {2, 12, 1, 4, 4};
cout << solve(v);
}
ผลลัพธ์
1
คำอธิบาย: โค้ดคืนค่า 1 (true) เพราะพบ triplet (0, 1, 3) → nums[0]=2, nums[1]=12, nums[3]=4 ทำให้ 2 < 4 < 12 ตรงเงื่อนไข