Leetcode 350. 两个数组的交集 II / python实现

文章目录

        • *题目*
        • *解题思路*
        • *代码实现*

题目

Leetcode 350. 两个数组的交集 II / python实现_第1张图片

解题思路

只想到复杂度相当高的动态规划(和最长公共子序列的做法几乎一致)和暴力(;′⌒`)。
排序再使用双指针很妙,哈希表的实现和双重循环思路其实是类似的。


代码实现

"""
哈希表
"""
from collections import Counter
class Solution:
    def intersect(self, nums1, nums2):
        nums1 = Counter(nums1)
        res = []
        for i in nums2:
            if i in nums1 and nums1[i]:
                res.append(i)
                nums1[i] -= 1
        return res
"""
排序后,再使用双指针
"""
class Solution:
    def intersect(self, nums1, nums2):
        nums1, nums2 = sorted(nums1), sorted(nums2)
        l1, l2 = 0, 0
        res = []
        while l1 < len(nums1) and l2 < len(nums2):
            if nums1[l1] == nums2[l2]:
                res.append(nums1[l1])
                l1 += 1
                l2 += 1
            elif nums1[l1] < nums2[l2]:
                l1 += 1
            else:
                l2 += 1
        return res
"""
动态规划
"""
class Solution:
    def intersect(self, nums1, nums2):
        nums1 = sorted(nums1)
        nums2 = sorted(nums2)
        dp = [[[]] * (len(nums2)+1) for _ in range(len(nums1)+1)]
        for i in range(1, len(nums1)+1):
            for j in range(1, len(nums2)+1):
                if nums1[i-1] == nums2[j-1]:
                    dp[i][j] = dp[i-1][j-1] + [nums1[i-1]]
                else:
                    dp[i][j] = max(dp[i][j-1], dp[i-1][j], key=len).copy()
        return dp[-1][-1]
"""
暴力
"""
class Solution:
    def intersect(self, nums1, nums2):
        res = []
        for i in range(len(nums1)):
            for j in range(len(nums2)):
                if nums1[i] == nums2[j]:
                    res.append(nums1[i])
                    nums2[j] = float("inf")
                    break
        return res

你可能感兴趣的:(leetcode)