Solution 3 – Two pointers (Best if both arrays were sorted)
func intersect(nums1 []int, nums2 []int) []int {
sort.Ints(nums1)
sort.Ints(nums2)
var ptr1,ptr2 int
var seen []int
for ptr1<len(nums1) && ptr2<len(nums2){
if nums1[ptr1]==nums2[ptr2]{
seen=append(seen,nums1[ptr1])
ptr1++
ptr2++
continue
}
if nums1[ptr1]<nums2[ptr2]{
ptr1++
} else {
ptr2++
}
}
return seen
}

Solution 2 – Frequency Hash table
func intersect(nums1 []int, nums2 []int) []int {
/*
One hash table + loop over second & collect
*/
m1 := make(map[int]int)
for _,val := range nums1{
m1[val]+=1
}
var seen []int
for _,num := range nums2{
if freq,exists:=m1[num];exists && freq>0{
seen=append(seen,num)
m1[num]--
}
}
return seen
}

Solution 1 – Two Hash tables – bad boy 😐
func intersect(nums1 []int, nums2 []int) []int {
/*
Intuition: make a map of seen elemnts for both
loop over map1 check if element exist in map2 if yes add to return slice
*/
m1 := make(map[int]int)
m2 := make(map[int]int)
for _,val := range nums1{
m1[val]+=1
}
for _,val := range nums2{
m2[val]+=1
}
var seen []int
for key,c1 := range m1{
if c2,exists:=m2[key];exists{
min := c1
if c2<min{
min=c2
}
for range min{
seen = append(seen,key)
}
}
}
return seen
}

Leave a Reply