সমস্যা বিবরণ
একটি পূর্ণসংখ্যার অ্যারে দেওয়া আছে। চারটি এলিমেন্ট a, b, c, d খুঁজে বের করতে হবে যাতে a + b + c + d = target। অ্যারেতে সব unik কোয়াড্রুপলেট বের করতে হবে।
উদাহরণ: অ্যারে = [-1,0,1,2,0,-2], target = 0 হলে ফলাফল [[-1,0,0,1],[-2,-1,1,2],[-2,0,0,2]]।
সমাধানের পদ্ধতি
সাধারণত kSum() ফাংশন ব্যবহার করে সমাধান করা হয়। প্রাথমিক কল করা হয় k=4 দিয়ে। ফাংশনটি নিম্নরূপ:
- একটি রেজাল্ট অ্যারে ডিফাইন করুন।
- যদি k = 2 হয়, তবে টু-পয়েন্টার টেকনিক ব্যবহার করে জোড়া বের করুন।
- অন্যথায়, start থেকে arr.size() - k পর্যন্ত লুপ চালিয়ে প্রতিটি এলিমেন্ট নিয়ে রিকার্সিভলি k-1 সম সমাধান করুন।
- ডুপ্লিকেট এড়াতে সো্র্ট করা অ্যারেতে সমান এলিমেন্ট স্কিপ করুন।
C++ কোড উদাহরণ
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<vector<int> > v) {
cout << "[";
for (int i = 0; i < v.size(); i++) {
cout << "[";
for (int j = 0; j < v[i].size(); j++) {
cout << v[i][j] << ", ";
}
cout << "],";
}
cout << "]" << endl;
}
class Solution {
public:
void addAll(vector<vector<int> >& res, vector<vector<int> >& temp) {
for (int i = 0; i < temp.size(); i++) res.push_back(temp[i]);
}
vector<vector<int>> fourSum(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
return kSum(nums, 0, 4, target);
}
vector<vector<int>> kSum(vector<int>& arr, int start, int k, int target) {
vector<vector<int>> res;
if (k == 2) {
int left = start;
int right = arr.size() - 1;
vector<int> temp(2);
while (left < right) {
if (arr[left] + arr[right] == target) {
temp[0] = arr[left];
temp[1] = arr[right];
res.push_back(temp);
while (left < right && arr[left] == arr[left + 1]) left++;
while (left < right && arr[right] == arr[right - 1]) right--;
left++;
right--;
} else if (arr[left] + arr[right] > target) right--;
else left++;
}
} else {
for (int i = start; i < (int)arr.size() - k + 1; i++) {
if (i > start && arr[i] == arr[i - 1]) continue;
vector<vector<int>> temp = kSum(arr, i + 1, k - 1, target - arr[i]);
for (int j = 0; j < temp.size(); j++) {
temp[j].push_back(arr[i]);
}
addAll(res, temp);
}
}
return res;
}
};
int main() {
Solution ob;
vector<int> v = {1,0,-1,0,-2,2};
print_vector(ob.fourSum(v, 0));
}
ইনপুট
[1,0,-1,0,-2,2] 0
আউটপুট
[[1,2,-1,-2],[0,2,0,-2],[0,1,0,-1]]