zoukankan      html  css  js  c++  java
  • 0350-leetcode算法实现之两个数组的交集II-intersectionofTwoArrays-python&golang实现

    给定两个数组,编写一个函数来计算它们的交集。

    示例 1:
    输入:nums1 = [1,2,2,1], nums2 = [2,2]
    输出:[2,2]

    示例 2:
    输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
    输出:[4,9]

    说明:
    输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。
    我们可以不考虑输出结果的顺序。

    链接:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii

    python

    ## 哈希表,也适用于另一个数组很大,存在磁盘这种情况。遍历一个数组计数数值出现次数,遍历另外的数组,只要数值存在于哈希表且对应的value > 0 ,将结果加入返回结果中
    
    ## 效率:时间O(m+n), 空间借助哈希表,最坏O(n)
    class Solution:
        def intersectionII(self, nums1: [int], nums2: [int]) -> [int]:
            from collections import defaultdict
            m = defaultdict(int)
            res = list()
            for i in range(len(nums1)):
                m[nums1[i]] += 1
    
            for i in range(len(nums2)):
                if nums2[i] in m and m[nums2[i]] > 0:
                    res.append(nums2[i])
                    m[nums2[i]] -= 1
            return res
        # 排序加双指针 时间O(nlogn), 空间O(n)
        def intersectionII1(self, nums1: [int], nums2: [int]) -> [int]:
            nums1.sort()
            nums2.sort()
            p1, p2 = 0, 0
            len1, len2 = len(nums1), len(nums2)
            res = list()
            while p1 < len1 and p2 < len2:
                num1, num2 = nums1[p1], nums2[p2]
                if num1 == num2:
                    res.append(num1)
                    p1 += 1
                    p2 += 1
                elif num1 > num2:
                    p2 += 1
                else:
                    p1 += 1
            return res
    
    if __name__ == "__main__":
        nums1 = [1,2,2,2,2,2,4,7,5,3,6,12,6,7,5]
        nums2 = [5,13,15,9,8,2,3,4,2,5,5,4]
        test = Solution()
        print(test.intersectionII(nums1, nums2))
        print(test.intersectionII1(nums1, nums2))
    

    golang

    package main
    
    import (
    	"fmt"
    	"sort"
    )
    
    func main() {
    	var nums1 = []int{1, 1, 1, 1, 1, 3, 4, 5, 8, 5, 6, 3, 3}
    	var nums2 = []int{1, 1, 3, 4, 5, 8, 5, 19, 3}
    	res := intersectionII(nums1, nums2)
    	fmt.Println(res)
    	res1 := intersectionII1(nums1, nums2)
    	fmt.Println(res1)
    }
    
    func intersectionII(nums1 []int, nums2 []int) []int {
    	if len(nums1) > len(nums2) {
    		return intersectionII(nums2, nums1)
    	}
    
    	m := map[int]int{}
    	for _, v := range nums1 {
    		m[v]++
    	}
    	intersection := []int{}
    	for _, v := range nums2 {
    		if m[v] > 0 {
    			intersection = append(intersection, v)
    			m[v]--
    		}
    	}
    	return intersection
    }
    
    // 排序加双指针
    func intersectionII1(nums1 []int, nums2 []int) []int {
    	sort.Ints(nums1)
    	sort.Ints(nums2)
    	len1, len2 := len(nums1), len(nums2)
    	p1, p2 := 0, 0
    
    	intersection := []int{}
    
    	for p1 < len1 && p2 < len2 {
    		if nums1[p1] == nums2[p2] {
    			intersection = append(intersection, nums1[p1])
                            p1++
                            p2++
    		} else if nums1[p1] < nums2[p2] {
    			p1++
    		} else {
    			p2++
    		}
    	}
    	return intersection
    }
    
    
  • 相关阅读:
    UIDynamicBehavior的简单使用:接球小游戏
    UI控件初始化问题:initWithFrame和initWithCoder、aweakFromNib的执行
    ICP、MRR、BKA优化
    consul运维入门
    crontab问题
    archer运维相关问题
    git安装及错误处理
    galera
    线性回归
    python数据分析
  • 原文地址:https://www.cnblogs.com/davis12/p/15402217.html
Copyright © 2011-2022 走看看