মান লিইয়ে নিই Nটি বল্ব একটি সারিয়ে রয়েছে এবং সেগুলো 1 থেকে N পর্যন্ত নম্বর দিয়ে চিহ্নিত। প্রথমে সব বল্ব বন্ধ থাকে। আমরা প্রতিদিন ঠিক একটি বল্ব অন করব যতক্ষণ না N দিন পরে সব বল্ব অন হয়ে যায়। যদি আমাদের bulbs নামক একটি অ্যারে থাকে যার দৈর্ঘ্য N এবং bulbs[i] = x এর অর্থ হল (i+1)তম দিনে আমরা x পজিশনের বল্বটি অন করব। যদি আরেকটি পূর্ণসংখ্যা K থাকে, যাতে দুটি অন করা বল্বের মাঝপথে ঠিক Kটি বন্ধ বল্ব থাকে এমন ন্যূনতম দিন সংখ্যা বের করতে হবে। যদি এমন কোনো দিন না থাকে, তবে -1 ফেরত দিন।
সুতরাং, যদি ইনপুট হয় bulbs: [1,3,2] এবং K = 1, তবে আউটপুট হবে 2 কারণ
প্রথম দিনে: bulbs[0] = 1, প্রথম বল্ব অন হয়: [1,0,0]
দ্বিতীয় দিনে: bulbs[1] = 3, তৃতীয় বল্ব অন হয়: [1,0,1]
তৃতীয় দিনে: bulbs[2] = 2, দ্বিতীয় বল্ব অন হয়: [1,1,1]
আমরা 2 ফেরত দেব কারণ দ্বিতীয় দিনে, দুইটি অন করা বল্বের মাঝপথে একটি বন্ধ বল্ব ছিল।
সমাধান পদ্ধতি
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे:
- n := bulbs-এর আকার
- i := 0 থেকে आरंभ करें, जब i < n, अपडेट करें (i को 1 से बढ़ाएं), करें:
- days[bulbs[i] - 1] = i + 1
- left := 0, right := k + 1, ret := inf
- i := 0 থেকে आरंभ करें, जब right < n, अपडेट करें (i को 1 से बढ़ाएं), करें:
- यदि days[i] < days[left] বা days[i] <= days[right], तो:
- यदि i, right-এর সমান হয়, তবে:
- ret := ret এবং days[left] ও days[right]-এর সর্বোচ্চের ন্যূনতম
- left := i
- right := i + k + 1
- यदि i, right-এর সমান হয়, তবে:
- यदि days[i] < days[left] বা days[i] <= days[right], तो:
- ফেরত দিন (যদি ret, inf-এর সমান হয়, তবে -1, অন্যথায় ret)
উদাহরণ
বेहतर समझ के लिए निम्नलिखित कार्यान्वयन देखें:
#include <bits/stdc++.h> using namespace std; class Solution { public: int kEmptySlots(vector<int>& bulbs, int k) { int n = bulbs.size(); vector<int> days(n); for (int i = 0; i < n; i++) { days[bulbs[i] - 1] = i + 1; } int left = 0; int right = k + 1; int ret = INT_MAX; for (int i = 0; right < n; i++) { if (days[i] < days[left] || days[i] <= days[right]) { if (i == right) { ret = min(ret, max(days[left], days[right])); } left = i; right = i + k + 1; } } return ret == INT_MAX ? -1 : ret; } }; main(){ Solution ob; vector<int> v = {1,3,2}; cout << (ob.kEmptySlots(v, 1)); }
इनपुट
{1,3,2},
आउटपुट
2