Giả sử chúng ta có một danh sách các số được gọi là nums, chúng ta phải kiểm tra xem có các bộ ba (i, j, k) sao cho i
Vì vậy, nếu đầu vào là nums =[2, 12, 1, 4, 4], thì đầu ra sẽ là True, vì [2, 12, 4] khớp với tiêu chí vì 2 <4 <12.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
n:=kích thước của nums
Xác định một mảng bên trái có kích thước n
left [0]:=nums [0]
để khởi tạo i:=1, khi i
left [i]:=tối thiểu nums [i] và left [i - 1]
Xác định một ngăn xếp
để khởi tạo i:=n - 1, khi i> =1, cập nhật (giảm i đi 1), thực hiện -
x:=left [i - 1]
trong khi st không trống và đầu st <=x, do -
bật từ st
nếu st không trống và x
trả về true
đẩy nums [i] vào st
trả về false
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
#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);
}
Đầu vào
{2, 12, 1, 4, 4}
Đầu ra
1