#include <bits/stdc++.h>
using namespace std;
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
// Sort both arrays
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());
vector<int> ans;
int i = 0, j = 0;
// Two pointer method
while (i < nums1.size() && j < nums2.size()) {
if (nums1[i] < nums2[j]) {
i++;
}
else if (nums1[i] > nums2[j]) {
j++;
}
else {
// nums1[i] == nums2[j]
if (ans.empty() || ans.back() != nums1[i]) {
ans.push_back(nums1[i]); // add only once
}
i++;
j++;
}
}
return ans;
}
int main() {
vector<int> a = {1, 2, 2, 1};
vector<int> b = {2, 2};
vector<int> res = intersection(a, b);
for (int x : res)
cout << x << " ";
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp2ZWN0b3I8aW50PiBpbnRlcnNlY3Rpb24odmVjdG9yPGludD4mIG51bXMxLCB2ZWN0b3I8aW50PiYgbnVtczIpIHsKICAgIC8vIFNvcnQgYm90aCBhcnJheXMKICAgIHNvcnQobnVtczEuYmVnaW4oKSwgbnVtczEuZW5kKCkpOwogICAgc29ydChudW1zMi5iZWdpbigpLCBudW1zMi5lbmQoKSk7CgogICAgdmVjdG9yPGludD4gYW5zOwogICAgaW50IGkgPSAwLCBqID0gMDsKCiAgICAvLyBUd28gcG9pbnRlciBtZXRob2QKICAgIHdoaWxlIChpIDwgbnVtczEuc2l6ZSgpICYmIGogPCBudW1zMi5zaXplKCkpIHsKICAgICAgICBpZiAobnVtczFbaV0gPCBudW1zMltqXSkgewogICAgICAgICAgICBpKys7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG51bXMxW2ldID4gbnVtczJbal0pIHsKICAgICAgICAgICAgaisrOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gbnVtczFbaV0gPT0gbnVtczJbal0KICAgICAgICAgICAgaWYgKGFucy5lbXB0eSgpIHx8IGFucy5iYWNrKCkgIT0gbnVtczFbaV0pIHsKICAgICAgICAgICAgICAgIGFucy5wdXNoX2JhY2sobnVtczFbaV0pOyAgLy8gYWRkIG9ubHkgb25jZQogICAgICAgICAgICB9CiAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgaisrOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBhbnM7Cn0KCmludCBtYWluKCkgewogICAgdmVjdG9yPGludD4gYSA9IHsxLCAyLCAyLCAxfTsKICAgIHZlY3RvcjxpbnQ+IGIgPSB7MiwgMn07CgogICAgdmVjdG9yPGludD4gcmVzID0gaW50ZXJzZWN0aW9uKGEsIGIpOwoKICAgIGZvciAoaW50IHggOiByZXMpCiAgICAgICAgY291dCA8PCB4IDw8ICIgIjsKfQ==