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
    }
    
    
  • 相关阅读:
    JS jQuery显示隐藏div的几种方法
    PHP 二维数组去重(保留指定键值的同时去除重复的项)
    Java面试题解析(一)
    Java :面向对象
    使用 Spring Framework 时常犯的十大错误
    Spring Boot 面试的十个问题
    《深入理解 Java 内存模型》读书笔记
    Spring Boot 2.0 迁移指南
    MaidSafe区块链项目白皮书解读
    20190712共学问题归纳
  • 原文地址:https://www.cnblogs.com/davis12/p/15402217.html
Copyright © 2011-2022 走看看