मान लीजिए कि हमारे पास एक सरणी संख्या है जिसे आरोही क्रम में क्रमबद्ध किया गया है। हमें सच लौटना होगा अगर और केवल अगर हम इसे 1 या अधिक बाद में विभाजित कर सकते हैं जैसे कि प्रत्येक अनुवर्ती में लगातार पूर्णांक होते हैं और जिनकी लंबाई कम से कम 3 होती है। तो अगर इनपुट [1,2,3,3,4] जैसा है 4,5,5], तो आउटपुट ट्रू होगा, क्योंकि हमारे पास लगातार दो सीक्वेंस हैं। ये हैं [1,2,3,4,5] और [3,4,5]।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- नक्शा m बनाएं और nums की आवृत्ति m में स्टोर करें, nums का आकार m में स्टोर करें
- सीएनटी:=एन
- मैं के लिए 0 से n - 1 की सीमा में
- x :=nums[i]
- अगर एम[एक्स] और एम[एक्स + 1] और एम[एक्स + 2]
- m[x], m[x + 1] और m[x + 2] को 1 से घटाएं, x को 3 से बढ़ाएं और गिनती में 3 की कमी करें
- जबकि m[x]> 0 और m[x]> m[x – 1]
- cnt को 1 से घटाएं, m[x] को 1 से घटाएं और x को 1 से बढ़ाएं
- यदि cnt 0 है, तो सही है, अन्यथा गलत है
- बेहतर समझने के लिए आइए निम्नलिखित कार्यान्वयन को देखें -
उदाहरण
#include <bits/stdc++.h> using namespace std; class Solution { public: bool isPossible(vector<int>& nums) { unordered_map <int, int> m; int n = nums.size(); for(int i = 0; i < n; i++){ m[nums[i]]++; } int cnt = n; for(int i = 0; i < n; i++){ int x = nums[i]; if(m[x] && m[x + 1] && m[x + 2]){ m[x]--; m[x + 1]--; m[x + 2]--; x += 3; cnt -= 3; while(m[x] > 0 && m[x] > m[x - 1]){ cnt--; m[x]--; x++; } } } return cnt == 0; } }; main(){ vector<int> v = {1,2,3,3,4,4,5,5}; Solution ob; cout << (ob.isPossible(v)); }
इनपुट
[1,2,3,3,4,4,5,5]
आउटपुट
1