मान लीजिए कि हमारे पास संख्याओं की एक सूची है जिसे nums और दूसरी संख्या k कहा जाता है, हम किसी भी सबलिस्ट को सूची से अधिकतम एक बार हटा सकते हैं। हमें सबसे लंबी परिणामी सूची की लंबाई का पता लगाना होगा जैसे कि k से सख्ती से कम और k से सख्ती से बड़ी संख्या समान हो।
इसलिए, यदि इनपुट संख्या =[6, 10, 8, 9, 3, 5], k =6 की तरह है, तो आउटपुट 5 होगा, जैसे कि हम सबलिस्ट [9] को हटा दें तो हमें [6, 10, 8, 3, 5] और दो संख्याएँ [3, 5] हैं जो 6 से छोटी हैं और दो संख्याएँ [10, 8] 6 से बड़ी हैं।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- संख्या + 1 के समान आकार की एक सरणी v परिभाषित करें और 0 से भरें
- सीएनटी:=0
- इनिशियलाइज़ i :=0 के लिए, जब i <अंकों का आकार, अपडेट करें (i से 1 बढ़ाएँ), करें -
- यदि अंक [i]
- (cnt 1 से बढ़ाएँ)
- यदि अंक [i]
- अन्यथा जब nums[i]> k, तब:
- (cnt 1 से घटाएं)
- v[i + 1] =cnt
- डेल्टा:=v का अंतिम तत्व
- करें
- यदि m[v[i] - v का अंतिम अवयव 0 के बराबर नहीं है या (v[i] - v का अंतिम अवयव 0 के समान है), तो −
- Ans :=न्यूनतम उत्तर और i - m[v[i] - v का अंतिम तत्व]
- m[v[i]] :=i
- वापसी 0
- अंकों का वापसी आकार
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#include <bits/stdc++.h> using namespace std; class Solution { public: int solve(vector<int>& nums, int k) { vector<int> v(nums.size() + 1, 0); int cnt = 0; for (int i = 0; i < nums.size(); ++i) { if (nums[i] < k) ++cnt; else if (nums[i] > k) --cnt; v[i + 1] = cnt; } if (v.back() == 0) return int(nums.size()); int delta = v.back(); map<int, int> m; int ans = INT_MAX; for (int i = 1; i <= v.size(); ++i) { if (m[v[i] - v.back()] != 0 || v[i] - v.back() == 0) { ans = min(ans, i - m[v[i] - v.back()]); } m[v[i]] = i; } if (ans == INT_MAX) return 0; else return int(nums.size() - ans); } }; main(){ Solution ob; vector<int> v = {6, 10, 8, 9, 3, 5}; int k = 6; cout << ob.solve(v, k); }
इनपुट
{6, 10, 8, 9, 3, 5}, 6
आउटपुट
5