【哈希表】leetcode349_兩個數組的交集

編號349:兩個數組的交集

給定兩個數組,編寫一個函數來計算它們的交集。golang

示例 1:數組

輸入:nums1 = [1,2,2,1], nums2 = [2,2]
輸出:[2]

示例 2:app

輸入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
輸出:[9,4]

說明:函數

輸出結果中的每一個元素必定是惟一的。
咱們能夠不考慮輸出結果的順序。優化

思路

能夠發現,貌似用數組作哈希表能夠解決這道題目,把nums1的元素,映射到哈希數組的下表上,而後在遍歷nums2的時候,判斷是否出現過就能夠了。可是題目並無說明限制數組數值大小,若是哈希值比較少、特別分散、跨度很是大,使用數組就形成空間的極大浪費。不像前面的兩道題,數組存儲英文的26個字母,是固定且個數較少,比較適合採用數組。code

所以這題咱們採用set集合,注意,在golang中是沒有set類型的,咱們能夠採用map類型代替,用map的key做爲惟一值並進行去重。例如輸入:nums1 = [1,2,2,1], nums2 = [2,2],利用map[int]bool存儲nums1就變成了mp={1:true,2:true},能夠節省一部分空間。此時再遍歷num2中的元素,若是有交集的元素則存入result結果集就好。內存

具體代碼以下:io

func intersection(nums1 []int, nums2 []int) []int {
	mp := make(map[int]bool)
	result := make([]int, 0)  //存放交集元素

	for _, n1 := range nums1 { //將nums1中的數做爲mp中的鍵,實現去重效果
		mp[n1] = true
	}

	for _, n2 := range nums2 {
		if mp[n2] {
			mp[n2] = false
			result = append(result, n2)
		}
	}

	return result
}

這裏能夠作個空間優化:map的value值是布爾型,這會致使set多佔用內存空間,解決這個問題,則能夠將其替換爲空結構。在Go中,空結構一般不使用任何內存。即unsafe.Sizeof(struct{}{}) 的結果爲 0。class

func intersection(nums1 []int, nums2 []int) []int {
	mp := make(map[int]struct{})
	result := make([]int, 0)

	for _, n1 := range nums1 { //將nums1中的數做爲mp中的鍵,實現去重效果
		mp[n1] = struct{}{}
	}

	for _, n2 := range nums2 {
		if _, ok := mp[n2]; ok {
			result = append(result, n2)
			delete(mp, n2)
		}
	}

	return result
}
相關文章
相關標籤/搜索