sudopower

LC: 350: Intersection of Two Arrays II

lc_350

Link to problem

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

Your email address will not be published. Required fields are marked *