এই সমস্যায়, আমাদেরকে পূর্ণসংখ্যার মানের একটি অ্যারে দেওয়া হয়েছে এবং আমাদের এই অ্যারে থেকে সেই সমস্ত সাবয়ারে প্রিন্ট করতে হবে যেগুলির যোগফল 0 এর সমান।
বিষয়টি আরও ভালোভাবে বোঝার জন্য একটি উদাহরণ দেওয়া যাক,
ইনপুট:অ্যারে =[-5, 0, 2, 3, -3, 4, -1]আউটপুট:যোগফল 0 সহ সাবরে 1 থেকে 4 পর্যন্ত। যোগফল 0 সহ সাবাররে 5 থেকে 7 পর্যন্ত যোগফল 0 সহ 0 থেকে 7
এই সমস্যাটি সমাধান করার জন্য, আমরা সম্ভাব্য সমস্ত সাবয়ারে পরীক্ষা করব। এবং এই সাবয়ারের যোগফল 0 এর সমান কিনা তা পরীক্ষা করুন এবং তাদের প্রিন্ট করুন। এই সমাধানটি বোঝা সহজ কিন্তু সমাধানটি জটিল, এবং এর সময় জটিলতা হল O(n^2) .
এই সমস্যার একটি ভাল সমাধান হ্যাশিং ব্যবহার করা হয়। এটি সমাধানের জন্য আমরা যোগফল খুঁজে পাব যদি এটি 0 এর সমান হয় তাহলে হ্যাশ টেবিলে যোগ করুন।
অ্যালগরিদম
<প্রে>ধাপ 1:একটি সমষ্টি পরিবর্তনশীল তৈরি করুন। ধাপ 2:যোগফল =0 হলে, সাবয়ারে সূচক 0 থেকে শুরু করে অ্যারের শেষ সূচক পর্যন্ত। ধাপ 3:যদি বর্তমান যোগফল হ্যাশ টেবিলে থাকে। ধাপ 4:যদি যোগফল বিদ্যমান, তাহলে i+1 থেকে n পর্যন্ত সাবয়ারে অবশ্যই শূন্য হতে হবে। ধাপ 5:অন্যথায় হ্যাশ টেবিলে ঢোকান।উদাহরণ
#includeনেমস্পেস ব্যবহার করে std;vector > findSubArrayWithSumZero(int arr[], int n){ unordered_map >map; ভেক্টর > out; int sum =0; জন্য (int i =0; i vc =map[sum]; for (auto it =vc.begin(); it !=vc.end(); it++) out.push_back(make_pair(*it + 1, i)); } মানচিত্র [সমষ্টি].পুশ_ব্যাক(i); } return out;}int main(){int arr[] ={-5, 0, 2, 3, -3, 4, -1}; int n =sizeof(arr)/sizeof(arr[0]); ভেক্টর > out =findSubArrayWithSumZero(arr, n); if (out.size() ==0) cout <<"কোনও সাবারে বিদ্যমান নেই"; else এর জন্য (auto it =out.begin(); it !=out.end(); it++) cout<<"যোগফল 0 সহ সাবারে "< first <<" থেকে "< দ্বিতীয়< আউটপুট
যোগফল 0 সহ 1 থেকে 1 সুবারে যোগফল 0 সহ 0 থেকে 3 পর্যন্ত যোগফল 0 সহ 3 থেকে 4 সুবারে যোগফল 0 সহ 0 থেকে 6 সুবারে যোগফল 0 থেকে 4 থেকে 6 পর্যন্ত হয়