मान लीजिए कि हमारे पास एक पंक्ति में N बल्ब हैं और उनकी संख्या 1 से N तक है। सबसे पहले, सभी बल्ब बंद हैं। हम प्रतिदिन ठीक एक बल्ब को तब तक चालू कर सकते हैं जब तक कि N दिनों के बाद सभी बल्ब चालू न हो जाएं। यदि हमारे पास लंबाई N का एक सरणी बल्ब है जहां बल्ब [i] =x यह इंगित करता है कि (i+1)वें दिन, हम बल्ब को स्थिति x पर चालू करेंगे। यदि हमारे पास एक और पूर्णांक K है, जैसे कि न्यूनतम दिन संख्या इस तरह से मौजूद है कि दो चालू बल्ब मौजूद हैं जिनके बीच बिल्कुल K बल्ब हैं जो सभी बंद हैं। अगर ऐसा कोई दिन नहीं है, तो -1 लौटें।
इसलिए, यदि इनपुट बल्ब की तरह है:[1,3,2] और के =1, तो आउटपुट 2 के रूप में होगा
-
पहले दिन:बल्ब[0] =1, पहला बल्ब चालू होता है:[1,0,0]
-
दूसरे दिन:बल्ब[1] =3, फिर तीसरा बल्ब चालू होता है:[1,0,1]
-
तीसरे दिन:बल्ब[2] =2, फिर दूसरा बल्ब चालू होता है:[1,1,1]
हम 2 वापस करेंगे क्योंकि दूसरे दिन, दो बल्ब ऑन थे और उनके बीच एक ऑफ बल्ब था।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
n :=बल्बों का आकार
-
इनिशियलाइज़ i:=0 के लिए, जब i
-
दिन [बल्ब[i] - 1] =i + 1
-
-
बाएँ:=0, दाएँ:=k + 1, ret:=inf
-
इनिशियलाइज़ करने के लिए:=0, जब राइट
-
अगर दिन [i] <दिन [बाएं] या दिन [i] <=दिन [दाएं], तो -
-
अगर मैं सही के समान हूं, तो -
-
रिट :=न्यूनतम सेवानिवृत्त और अधिकतम दिन[बाएं] और दिन[दाएं]
-
-
बायां :=मैं
-
दाएँ :=i + k + 1
-
-
-
वापसी (यदि रिट inf के समान है, तो -1, अन्यथा रिट)
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#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