मान लीजिए कि हमारे पास सम लंबाई के साथ पूर्णांक A की एक सरणी है, अब हमें सच कहना होगा यदि और केवल यदि इसे इस तरह से पुन:व्यवस्थित करना संभव हो कि A[2 * i + 1] =2 * A[2 * i] प्रत्येक 0 <=i <लेन (ए) / 2 के लिए। तो यदि इनपुट [3,1,3,6] जैसा है तो परिणाम गलत होगा, जहां [4,-2,2,-4], सच लौटेगा।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
एक नक्शा बनाएं एम, एन:=ए का आकार, ए में प्रत्येक तत्व की आवृत्ति को मानचित्र एम में संग्रहीत करें
-
cnt :=A का आकार
-
मानचित्र में प्रत्येक कुंजी-मान युग्म kv के लिए
-
अगर एम [केवी की कुंजी]> 0, तो
-
अगर m[kv की key] 0 नहीं है और m[2* key of kv]> 0
-
x :=मिनट का m[kv की कुंजी] और m[2* kv की कुंजी]
-
सीएनटी:=सीएनटी - (एक्स * 2)
-
x द्वारा m[2 * kv की कुंजी] घटाएं
-
मी [केवी की कुंजी] को x से कम करें
-
-
अन्यथा जब kv =0 की कुंजी हो, तब
-
सीएनटी:=सीएनटी - एम [केवी की कुंजी]
-
एम [केवी की कुंजी] :=0
-
-
-
-
जब सीएनटी शून्य न हो, तो झूठी वापसी करें, अन्यथा सत्य
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#include <bits/stdc++.h> using namespace std; class Solution { public: bool canReorderDoubled(vector<int>& A) { map <int, int> m; int n = A.size(); for(int i = 0; i < n; i++){ m[A[i]]++; } int cnt = A.size(); map <int, int> :: iterator it = m.begin(); while(it != m.end()){ if(m[it->first] > 0){ if(it->first != 0 && m[it->first * 2] > 0){ int x = min(m[it->first], m[it->first * 2]); cnt -= (x * 2); m[it->first * 2] -= x; m[it->first] -= x; }else if(it->first == 0){ cnt -= m[it->first]; m[it->first] = 0; } } it++; } return !cnt; } }; main(){ vector<int> v1 = {3,1,3,6}; Solution ob; cout << (ob.canReorderDoubled(v1)) << endl; v1 = {4,-2,2,-4}; cout << (ob.canReorderDoubled(v1)); }
इनपुट
[3,1,3,6] [4,-2,2,-4]
आउटपुट
0 1