Python中怎么求兩個數(shù)組的交集,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
我們一直強調成都做網(wǎng)站、網(wǎng)站設計對于企業(yè)的重要性,如果您也覺得重要,那么就需要我們慎重對待,選擇一個安全靠譜的網(wǎng)站建設公司,企業(yè)網(wǎng)站我們建議是要么不做,要么就做好,讓網(wǎng)站能真正成為企業(yè)發(fā)展過程中的有力推手。專業(yè)網(wǎng)站建設公司不一定是大公司,成都創(chuàng)新互聯(lián)作為專業(yè)的網(wǎng)絡公司選擇我們就是放心。
題目:
給定兩個數(shù)組,編寫一個函數(shù)來計算它們的交集。
示例 1:
輸入: nums1 = [1,2,2,1], nums2 = [2,2] 輸出: [2,2]
示例 2:
輸入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] 輸出: [4,9]
說明:
輸出結果中每個元素出現(xiàn)的次數(shù),應與元素在兩個數(shù)組中出現(xiàn)的次數(shù)一致。
我們可以不考慮輸出結果的順序。
進階:
如果給定的數(shù)組已經(jīng)排好序呢?你將如何優(yōu)化你的算法?
如果 nums1 的大小比 nums2 小很多,哪種方法更優(yōu)?
如果 nums2 的元素存儲在磁盤上,磁盤內(nèi)存是有限的,并且你不能一次加載所有的元素到內(nèi)存中,你該怎么辦?
解題思路:
暴力解題就不說了。
哈希表:利用哈希映射求得其中一個數(shù)組每個數(shù)字出現(xiàn)的頻次。遍歷另一個數(shù)組,每遇到相同數(shù)字,其存儲頻次減一,若頻次為 0,則移出哈希映射。如:
輸入 nums1 = [4, 9, 5], nums2 = [9, 4, 9, 8, 4 }計算 nums1 頻次: { 4:1, 9:1, 5:1 },Key = {4 , 9, 5 }遍歷 nums2:9 存在于 Key,9 頻次 -1 為 0,9 移出 HashMap:{ 4:1, 5:1 }4 存在于 Key,4 頻次 -1 為 0,4 移出 HashMap:{ 5:1 }9 不存在于 Key,跳過8 不存在于 Key,跳過...輸出:{9, 4}
雙指針:先把兩個數(shù)組排序,定義兩個指針 i, j ,移動指針
如果 nums1 [i] == nums2 [j],則該數(shù)共有。
如果不等,則移動元素值小的指針。
如:
輸入 nums1 = [ 4, 9, 5 ], nums2 = [ 9, 4, 9, 8, 4 ] 排序 nums1 = [ 4, 5, 9 ], nums2 = [ 4, 4, 8, 9, 9 ] 雙指針遍歷:[ 4, 5, 9],[ 4, 4, 8, 9, 9 ] ^ ^ 4 = 4, 存入 res = [4], 移動雙指針: [ 4, 5, 9],[ 4, 4, 8, 9, 9 ] ^ ^ 5 > 4, 移動指向 4 的指針:[ 4, 5, 9],[ 4, 4, 8, 9, 9 ] ^ ^ 5 < 8, 移動指向 5 的指針:[ 4, 5, 9],[ 4, 4, 8, 9, 9 ] ^ ^ 9 > 8, 移動指向 8 的指針:[ 4, 5, 9],[ 4, 4, 8, 9, 9 ] ^ ^ 9 = 9, 存入 res = [4, 9], 移動雙指針: [ 4, 5, 9 ],[ 4, 4, 8, 9, 9 ] ^ ^ 超過 nums1 長度,結束,返回 res
回答進階問題:
雙指針法主要耗時操作就是排序操作的排序算法。對于有序數(shù)組當然使用雙指針解題。
在一個數(shù)組長度遠小于另一個數(shù)組時,哈希表解題更優(yōu),只需哈希統(tǒng)計長度較小的數(shù)組的元素頻次,遍歷長數(shù)組即可。時間復雜度取決于長數(shù)組長度。如果用雙指針法,對長數(shù)組的排序將消耗更多時間。
如果內(nèi)存有限,只能選擇雙指針法或暴力破解,無需額外空間復雜度。使用哈希表時在最壞情況下:每個數(shù)字只出現(xiàn)一次,HashMap 元素頻次統(tǒng)計后,其大小可能大于內(nèi)存容量。
哈希表解題:
Java:
class Solution { public int[] intersect(int[] nums1, int[] nums2) { HashMap<Integer, Integer> map = new HashMap<>(); List<Integer> list = new ArrayList<>();//動態(tài)數(shù)組 for (Integer num : nums1) map.put(num, map.getOrDefault(num, 0) + 1);//統(tǒng)計元素出現(xiàn)頻次 for (Integer num : nums2) {//遍歷另一個數(shù)組 if (map.containsKey(num)) { int tmp = map.get(num)-1;//頻次減一 if (tmp == 0) map.remove(num);//頻次為 0 時,移出 HashMap else map.put(num, tmp);//否則更新頻次 list.add(num);//加入動態(tài)數(shù)組 } } //轉為數(shù)組并返回 int size=list.size(); int[] res = new int[size]; for (int i = 0; i < size; i++) res[i] = list.get(i); return res; }}
Python:
class Solution: def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]: count = dict(collections.Counter(nums1))# 自帶庫統(tǒng)計元素出現(xiàn)頻次,并轉為 Dict 類型 res = [] for num in nums2:# 遍歷另一個數(shù)組 if num in count: count[num] -= 1# 詞頻減一 res.append(num) if count[num] <= 0:# 詞頻為 0 時,移出字典 count.pop(num) return res
雙指針解題:
Java:
class Solution { public int[] intersect(int[] nums1, int[] nums2) { List<Integer> list = new ArrayList<>(); Arrays.sort(nums1);//排序數(shù)組 Arrays.sort(nums2); int i = 0, j = 0;//定義指針 while (i < nums1.length && j < nums2.length) { if (nums1[i] < nums2[j]) i++;//移動較小數(shù)的指針 else if (nums1[i] > nums2[j]) j++;//移動較小數(shù)的指針 else { //兩數(shù)相等則為交集,存入動態(tài)數(shù)組,移動雙指針 list.add(nums1[i]); i++; j++; } } //轉為數(shù)組并返回 int[] res = new int[list.size()]; for (int k = 0; k < list.size(); k++) res[k] = list.get(k); return res; }}
Python:
class Solution: def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]: i, j, nums1_size, nums2_size = 0, 0, len(nums1), len(nums2)# 定義指針,計算數(shù)組長度 nums1, nums2, res = sorted(nums1), sorted(nums2), []# 排序數(shù)組,初始化返回數(shù)組 res while i < nums1_size and j < nums2_size:# 循環(huán)條件為指針不溢出 if nums1[i] < nums2[j]:# 移動數(shù)值較小的指針 i += 1 elif nums1[i] > nums2[j]:# 移動數(shù)值較小的指針 j += 1 else: res.append(nums1[i])# 數(shù)值相等,則為交集,移動雙指針 i += 1 j += 1 return res
關于Python中怎么求兩個數(shù)組的交集問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關知識。
網(wǎng)站名稱:Python中怎么求兩個數(shù)組的交集
瀏覽路徑:http://m.rwnh.cn/article20/gdieco.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、商城網(wǎng)站、網(wǎng)站維護、網(wǎng)站設計、網(wǎng)站收錄、品牌網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)