আমাদের একটি এলিমেন্ট সেট আছে। এবং একটি গুণফল K। কাজ হল চেক করা যে লিংকড লিস্টে দুটি সংখ্যা আছে কিনা যাদের গুণফল K-এর সমান। যদি দুটি সংখ্যা থাকে, তবে সেগুলো প্রিন্ট করুন, যদি একাধিক থাকে, তবে যেকোনো একটি প্রিন্ট করুন। ধরুন লিংকড লিস্টটি {2, 4, 8, 12, 15} এবং K = 16। তবে এটি (2, 8) রিটার্ন করবে।
এটি হ্যাশিং টেকনিক দিয়ে সমাধান করব। একটি হ্যাশ টেবিল নিন এবং সব এলিমেন্টকে ০ দিয়ে মার্ক করুন। এখন লিংকড লিস্টে উপস্থিত এলিমেন্টগুলো হ্যাশ টেবিলে ১ দিয়ে মার্ক করুন। এখন লিংকড লিস্ট ট্রাভার্স শুরু করুন এবং চেক করুন দেওয়া গুণফল বর্তমান এলিমেন্ট দিয়ে বিভাজ্য কিনা। যদি হয়, তবে চেক করুন (K/বর্তমান এলিমেন্ট) লিংকড লিস্টে আছে কিনা হ্যাশ টেবিলে।
উদাহরণ কোড
#include <iostream>
#include <unordered_set>
#define MAX 100000
using namespace std;
class Node {
public:
int data;
Node* next;
};
void append(struct Node** start, int key) {
Node* new_node = new Node;
new_node->data = key;
new_node->next = (*start);
(*start) = new_node;
}
bool isPairPresent(Node* start, int K) {
unordered_set<int> s;
Node* p = start;
while (p != NULL) {
int current = p->data;
if ((K % current == 0) && (s.find(K / current) != s.end())) {
cout << current << " " << K / current;
return true;
}
s.insert(p->data);
p = p->next;
}
return false;
}
int main() {
Node* start = NULL;
int arr[] = {2, 4, 8, 12, 15};
int n = sizeof(arr)/sizeof(arr[0]);
for (int i = 0; i < n; i++) {
append(&start, arr[i]);
}
if (isPairPresent(start, 16) == false)
cout << "NO PAIR EXIST";
return 0;
}
আউটপুট
2 8