ধরুন আমাদের কাছে সংখ্যা নামক সংখ্যার একটি তালিকা আছে, আমাদের পরীক্ষা করতে হবে সেখানে ট্রিপলেট (i, j, k) আছে কিনা যেমন i
সুতরাং, যদি ইনপুটটি সংখ্যার মত হয় =[2, 12, 1, 4, 4], তবে আউটপুটটি সত্য হবে, কারণ [2, 12, 4] মানদণ্ডের সাথে মেলে কারণ 2 <4 <12।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
n :=সংখ্যার আকার
n
বাকি[0] :=সংখ্যা[0]
আরম্ভ করার জন্য i :=1, যখন i
left[i] :=ন্যূনতম সংখ্যা[i] এবং বাম[i - 1]
একটি স্ট্যাক স্ট্যাক সংজ্ঞায়িত করুন
আরম্ভ করার জন্য i :=n - 1, যখন i>=1, আপডেট করুন (i 1 দ্বারা কম করুন), করুন −
x :=বাম[i - 1]
যখন st খালি নয় এবং st <=x, do −
st
যদি st খালি না হয় এবং x
প্রত্যাবর্তন সত্য
সংখ্যাগুলিকে [i] st
মিথ্যা ফেরত দিন
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
#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);
}
ইনপুট
{2, 12, 1, 4, 4}
আউটপুট
1