মান লিইয়ে নিই একটি অ্যারে A রয়েছে। কিছু শুরু ইন্ডেক্স থেকে, আমরা জাম্পের একটি সিরিজ করতে পারি। সিরিজের (1, 3, 5, ...) পজিশনের জাম্পগুলোকে অড নাম্বার্ড জাম্প বলা হয়, এবং (2, 4, 6, ...) পজিশনের জাম্পগুলোকে ইভেন নাম্বার্ড জাম্প বলা হয়।
এখন আমরা ইন্ডেক্স i থেকে ফরোয়ার্ডে ইন্ডেক্স j-এ (i < j সহ) এইভাবে জাম্প করতে পারি:
অড নাম্বার্ড জাম্পের সময়, আমরা এমন ইন্ডেক্স j-এ জাম্প করতে পারি যাতে A[i] <= A[j] এবং A[j] সম্ভাব্য সবচেয়ে ছোট মান হয়। যখন একাধিক এমন ইন্ডেক্স j থাকে, তবে আমরা শুধু সবচেয়ে ছোট ঐ ইন্ডেক্স j-এ জাম্প করতে পারি।
ইভেন নাম্বার্ড জাম্পের সময়, আমরা এমন ইন্ডেক্স j-এ জাম্প করতে পারি যাতে A[i] >= A[j] এবং A[j] সম্ভাব্য সবচেয়ে বড় মান হয়। যখন একাধিক এমন ইন্ডেক্স j থাকে, তবে আমরা শুধু সবচেয়ে ছোট ঐ ইন্ডেক্স j-এ জাম্প করতে পারি।
হতে পারে কিছু ইন্ডেক্স i-এর জন্য কোনো বৈধ জাম্প নেই।
এখন একটি শুরু ইন্ডেক্সকে ভালো বলা হয় যখন, সেখান থেকে শুরু করে কিছুবার জাম্প দিয়ে অ্যারেটির শেষে পৌঁছানো যায়।
আমাদের ভালো শুরু ইন্ডেক্সের সংখ্যা বের করতে হবে।
সুতরাং, যদি ইনপুট হয় [10,13,12,14,15], তবে আউটপুট হবে ২, কারণ দুটি জায়গা ইন্ডেক্স ৩ এবং ৪ থেকে আমরা শেষে পৌঁছাতে পারি।
সমাধান পদ্ধতি
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे:
- ret := 1
- n := A-এর আকার
- আকার n-এর একটি nextGreaterEqual সরণি সংজ্ঞায়িত করুন -1 দিয়ে भरুন
- আকার n-এর একটি nextSmallerEqual সরণি সংজ্ঞায়িত করুন -1 দিয়ে भरুন
- একটি ম্যাপ st সংজ্ঞায়িত করুন
- i := n - 1 থেকে आरंभ করুন, जब i >= 0, আপডেট করুন (i 1 কমান), করুন:
- it := वह कुंजी-मूल्य युग्म जिसका मान A[i] से अधिक नहीं है
- nextGreaterEqual[i] := यदि (it) अंतिम तत्व नहीं है, तो it का मान, अन्यथा -1
- यदि यह st के अंतिम तत्व के बराबर नहीं है और it का पहला A[i] के बराबर है, तो:
- (it 1 बढ़ाएं)
- nextSmallerEqual[i] := यदि (it) पहला तत्व नहीं है, तो it के पिछले का मान, अन्यथा -1
- st[A[i]] := i
- আকার n x 2-এর একটি 2D সरणি v সংজ্ঞায়িত করুন এবং false দিয়ে भरুন
- v[n - 1, 0] = v[n - 1, 1] = true
- i := n - 2 থেকে आरंभ करें, जब i >= 0, अपडेट करें (i 1 कमाएं), करें:
- यदि nextGreaterEqual[i] -1 के बराबर नहीं है, तो:
- v[i, 1] := v[nextGreaterEqual[i], 0]
- यदि nextSmallerEqual[i] -1 के बराबर नहीं है, तो:
- v[i, 0] := v[nextSmallerEqual[i], 1]
- यदि v[i, 1] नन-जीरो है, तो:
- (ret 1 बढ़ाएं)
- यदि nextGreaterEqual[i] -1 के बराबर नहीं है, तो:
- ret फेरत दें
उदाहरण
बेहतर समझ के लिए निम्नलिखित कार्यान्वयन देखें:
#include <bits/stdc++.h> using namespace std; class Solution { public: int oddEvenJumps(vector<int>& A){ int ret = 1; int n = A.size(); vector<int> nextGreaterEqual(n, -1); vector<int> nextSmallerEqual(n, -1); map<int, int> st; for (int i = n - 1; i >= 0; i--) { map<int, int>::iterator it = st.lower_bound(A[i]); nextGreaterEqual[i] = (it != st.end()) ? it->second : -1; if (it != st.end() && it->first == A[i]) it++; nextSmallerEqual[i] = it != st.begin() ? prev(it)->second : -1; st[A[i]] = i; } vector<vector<bool> > v(n, vector<bool>(2, false)); v[n - 1][0] = v[n - 1][1] = true; for (int i = n - 2; i >= 0; i--) { if (nextGreaterEqual[i] != -1) { v[i][1] = v[nextGreaterEqual[i]][0]; } if (nextSmallerEqual[i] != -1) { v[i][0] = v[nextSmallerEqual[i]][1]; } if (v[i][1]) ret++; } return ret; } }; main(){ Solution ob; vector<int> v = {10,13,12,14,15}; cout << (ob.oddEvenJumps(v)); }
इनपुट
{10,13,12,14,15}
आउटपुट
2