मान लीजिए हमारे पास n संख्याओं की एक सरणी है; हमें एक गैर-रिक्त उपसमुच्चय को खोजना है जैसे कि उपसमुच्चय के तत्वों का योग n से विभाज्य हो। इसलिए, हमें ऐसे किसी भी उपसमुच्चय को उसके आकार और मूल सरणी में तत्वों के सूचकांक के साथ आउटपुट करना होगा जब वह मौजूद हो।
इसलिए, अगर इनपुट [3, 2, 7, 1, 9] जैसा है, तो आउटपुट [2], [1 2] होगा।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- एक मानचित्र my_map परिभाषित करें
- जोड़ें:=0
- इनिशियलाइज़ i :=0 के लिए, जब i
करें - जोड़ें :=(+ arr[i] जोड़ें) mod N
- यदि जोड़ 0 के समान है, तो −
- i + 1 प्रिंट करें
- इनिशियलाइज़ j :=0 के लिए, जब j <=i, अपडेट करें (j को 1 से बढ़ाएँ), −
- करें
- प्रिंट जे + 1
- वापसी
- यदि my_map में जोड़ें, तो −
- प्रिंट करें (i - my_map[add])
- इनिशियलाइज़ j :=my_map[add] + 1 के लिए, जब j <=i, अपडेट (j को 1 से बढ़ाएँ), −
- करें
- प्रिंट जे + 1
- वापसी
- अन्यथा
- my_map[add] :=i
उदाहरण (C++)
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
#include <bits/stdc++.h> using namespace std; void subset_find(int arr[], int N) { unordered_map<int, int> my_map; int add = 0; for (int i = 0; i < N; i++) { add = (add + arr[i]) % N; if (add == 0) { cout << i + 1 << endl; for (int j = 0; j <= i; j++) cout << j + 1 << " "; return; } if (my_map.find(add) != my_map.end()) { cout << (i - my_map[add]) << endl; for (int j = my_map[add] + 1; j <= i; j++) cout << j + 1 << " "; return; } else my_map[add] = i; } } int main() { int arr[] = {3, 2, 7, 1, 9}; int N = sizeof(arr) / sizeof(arr[0]); subset_find(arr, N); }
इनपुट
{3, 2, 7, 1, 9}
आउटपुट
2 1 2