मान लीजिए कि हमारे पास एक पंक्ति में क्षुद्रग्रहों का प्रतिनिधित्व करने वाले पूर्णांकों की एक सरणी क्षुद्रग्रह है। अब प्रत्येक क्षुद्रग्रह के लिए, निरपेक्ष मान उसके आकार का प्रतिनिधित्व करता है, और चिन्ह उसकी दिशा का प्रतिनिधित्व करता है जो क्रमशः दाएं और बाएं के लिए सकारात्मक या नकारात्मक हो सकता है। प्रत्येक क्षुद्रग्रह समान गति से चलता है।
हमें सभी टकरावों के बाद क्षुद्रग्रहों की स्थिति का पता लगाना है। जब दो क्षुद्र ग्रह आपस में मिलेंगे तो छोटे वाले में विस्फोट होगा। यदि दोनों एक ही आकार के हों, तो दोनों फट जाएंगे। एक ही दिशा में गति करने वाले दो क्षुद्रग्रह कभी नहीं मिलेंगे।
तो अगर इनपुट [5, 10, -5] जैसा है, तो आउटपुट [5, 10] होगा। यहां 10 और 5, 10 में टकराते हैं, फिर 5 और 10 कभी नहीं टकराएंगे।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
एक ऐरे को रिट करें, n :=arr का आकार
-
मेरे लिए 0 से n - 1 की सीमा में
-
यदि रिट खाली है या रिट का अंतिम तत्व सकारात्मक है और गिरफ्तारी [i] नकारात्मक है, तो
-
arr[i] को रिट में डालें, i को 1 से बढ़ाएँ
-
-
अन्यथा
-
x:=रिट का अंतिम तत्व, रिट से अंतिम तत्व हटाएं
-
absX :=|x|, absY :=|arr[i]|
-
अगर absX =absY, तो i को 1 से बढ़ा दें
-
अन्यथा
-
अगर absX> absY है, तो x को रिट में डालें, i को 1 बढ़ाएँ
-
-
-
-
वापसी रिट
उदाहरण (C++)
आइए एक बेहतर समझ प्राप्त करने के लिए निम्नलिखित कार्यान्वयन देखें -
#include <bits/stdc++.h> using namespace std; void print_vector(vector<auto> v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << v[i] << ", "; } cout << "]"<<endl; } class Solution { public: bool isNeg(int x){ return x < 0; } vector<int> asteroidCollision(vector<int>& arr) { vector <int> ret; int n = arr.size(); for(int i = 0; i< n; ){ if(ret.empty() || !(!isNeg(ret[ret.size() - 1]) && isNeg(arr[i]))){ ret.push_back(arr[i]); i++; } else { int x = ret[ret.size() - 1]; ret.pop_back(); int absX = abs(x); int absY = abs(arr[i]); if(absX == absY){ i++; } else { if(absX > absY){ ret.push_back(x); i++; } } } } return ret; } }; main(){ vector<int> v = {5, 10, -4}; Solution ob; print_vector(ob.asteroidCollision(v)); }
इनपुट
[5,10,-4]
आउटपुट
[5, 10, ]