Problem Statement
leetcode problem link
My Solution [Accepted]
public class Solution {
public IList<IList<int>> FindDifference(int[] nums1, int[] nums2) {
var hashSet1 = new HashSet<int>(nums1);
var hashSet2 = new HashSet<int>(nums2);
var ans0 = new List<int>();
var ans1 = new List<int>();
foreach(var num in nums1) {
if (!hashSet2.Contains(num) && !ans0.Contains(num)){
ans0.Add(num);
}
}
foreach(var num in nums2) {
if (!hashSet1.Contains(num) && !ans1.Contains(num)){
ans1.Add(num);
}
}
return new List<IList<int>> { ans0, ans1 };
}
}
Improve C#
public class Solution {
public IList<IList<int>> FindDifference(int[] nums1, int[] nums2) {
var set1 = new HashSet<int>(nums1);
var set2 = new HashSet<int>(nums2);
// Create copies to avoid modifying original sets
var diff1 = new HashSet<int>(set1);
var diff2 = new HashSet<int>(set2);
diff1.ExceptWith(set2); // elements exclusive to nums1
diff2.ExceptWith(set1); // elements exclusive to nums2
return new List<IList<int>> {
diff1.ToList(),
diff2.ToList()
};
}
}
Editorial
class Solution {
public:
// Returns the elements in the first arg nums1 that don't exist in the second arg nums2.
vector<int> getElementsOnlyInFirstList(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> onlyInNums1;
// Store nums2 elements in an unordered set.
unordered_set<int> existsInNums2;
for (int num : nums2) {
existsInNums2.insert(num);
}
// Iterate over each element in the list nums1.
for (int num : nums1) {
if (existsInNums2.find(num) == existsInNums2.end()) {
onlyInNums1.insert(num);
}
}
// Convert to vector.
return vector<int> (onlyInNums1.begin(), onlyInNums1.end());
}
vector<vector<int>> findDifference(vector<int>& nums1, vector<int>& nums2) {
return {getElementsOnlyInFirstList(nums1, nums2), getElementsOnlyInFirstList(nums2, nums1)};
}
};