刷题3-排序3

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

示例 1:

输入: nums1 = [1,2,2,1], nums2 = [2,2]

输出: [2,2]

示例 2:

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

输出: [4,9]

说明:

输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。

我们可以不考虑输出结果的顺序。

进阶:

如果给定的数组已经排好序呢?你将如何优化你的算法?

如果 nums1 的大小比 nums2 小很多,哪种方法更优?

如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

class Solution:

    def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:

        mylist = []

        for i in nums1:

            if i in nums2 and len(nums2) != 0:

                mylist.append(i)

                nums2.remove(i)

        return mylist

if __name__ == '__main__':

    res = Solution()

    rt = res.intersect([1,2,2,1],[2,2])

    print(rt)

复习了list的remove函数,是在源列表上操作,会改变源列表

但是我的代码运行时间还有运行内存太高,故而我换成如下操作:

思路:用字典

把list的各个元素当做key值,value值同一为1,有key有重复的话,value加1

第二个列表对比,且满足key所对应的value不等于0的条件下,才会追加mylist列表

class Solution:

    def func(self,nums1,nums2):

        mydict = {}

        mylist = []

        for j in range(len(nums1)):

            mydict[nums1[j]] = 0

        for i in range(len(nums1)):

            if nums1[i] in nums1:

                mydict[nums1[i]] += 1

            else:

                mydict[nums1[i]] = 1

        for iter in range(len(nums2)):

            if mydict.__contains__(nums2[iter]) and mydict[nums2[iter]] > 0:

                mylist.append(nums2[iter])

                mydict[nums2[iter]] -= 1

        return mylist

if __name__ == '__main__':

    res = Solution()

    rt = res.func([1,2,2,1],[2,2])

    print(rt)

总结:dict的key检查是否在这个字典中,Python2中是用has_key()函数,而在python3中删了这个函数,可以用__contains__方法。还有列表转化为字典的方法。这是一个列表转化为字典的方法。

两个列表转化字典的方法有dict(zip(列表1,列表2));其中列表1为key,列表2为value,且一短的列表为标尺。例如:

>>> a

[1, 2, 2, 3, 4]

>>> b

[12, 34, 4, 123, 123, 4534, 1323, 423434]

>>> dict(zip(a,b))

{1: 12, 2: 4, 3: 123, 4: 123}

你可能感兴趣的:(刷题3-排序3)