zoukankan      html  css  js  c++  java
  • ★ Leetcode-探索 | 两个数组的交集 II

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

    例如:
    给定 nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2, 2].

    注意:

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

    跟进:

      • 如果给定的数组已经排好序呢?你将如何优化你的算法?
      • 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
      • 如果nums2的元素存储在磁盘上,内存是有限的,你不能一次加载所有的元素到内存中,你该怎么办?

     ——————————————————————————————————————————————

    1. 如果考虑就地处理且不进行预处理的的话思路有限,一开始暴力算法也写得磕磕绊绊,下面是未完成debug的代码:

     1 class Solution(object):
     2     def intersect(self, nums1, nums2):
     3         """
     4         :type nums1: List[int]
     5         :type nums2: List[int]
     6         :rtype: List[int]
     7         """
     8         alen1 = len(nums1)
     9         alen2 = len(nums2)
    10         res = []
    11         
    12         i = j = 0
    13         while i < alen1:
    14             j = 0
    15             while j < alen2:
    16                 if nums1[i] == nums2[j]:
    17                     res.append(nums1[i])
    18                     alen1 -= 1
    19                     alen2 -= 1
    20                     if alen1 < 1 or alen2 < 1:
    21                         return res
    22                     
    23                     if i < alen1:
    24                         nums1[i] = nums1[alen1]
    25                         i -= 1
    26                     if j < alen2:
    27                         nums2[j] = nums2[alen2]
    28                     
    29                 j += 1
    30             i += 1
    31         
    32         return res

    2. 这种情况下要提醒自己此路不通另寻他途,因为算法设计本身并不是一个专精于技巧的事情,要以解决问题为目的,而评价标准也无外乎时空复杂度和算法的简洁性,易理解的特性,鲁棒性等,思考方式要依循数据结构的特点和常用的解决问题的模式/工具/思路方法。这里是否可以使用额外的辅助存储空间解决?

    3. 预处理的办法就比较简单了:

     AC代码:

     1 class Solution(object):
     2     def intersect(self, nums1, nums2):
     3         """
     4         :type nums1: List[int]
     5         :type nums2: List[int]
     6         :rtype: List[int]
     7         """
     8         nums1.sort()
     9         nums2.sort()
    10         
    11         alen1 = len(nums1)
    12         alen2 = len(nums2)
    13         
    14         res = []
    15         if alen1 == 0 or alen2 ==0:
    16             return res
    17         
    18         i = j = 0
    19         while i < alen1 and j < alen2:
    20             if nums1[i] == nums2[j]:
    21                 res.append(nums1[i])
    22                 i += 1
    23                 j += 1
    24             elif nums1[i] < nums2[j]:
    25                 i += 1
    26             elif nums1[i] > nums2[j]:
    27                 j += 1
    28         return res

    4. 一个新元素的引进:哈希。本质上还是引入了一个额外的辅助存储空间,而这个辅助存储空间是一个特殊的数据结构,具有可以随机访问多个同键值元素的特性

  • 相关阅读:
    P1121 环状最大两段子段和
    无题
    cdoj 1485 柱爷搞子串 sam treap
    自然数幂和
    Gym 100341C AVL Trees NTT
    线性筛分解质因子
    codeforces 366 Ant Man dp
    UVALive 6914 Maze Mayhem 轮廓线dp
    hdu 5790 Prefix 字典树 主席树
    莫比乌斯反演个人小结
  • 原文地址:https://www.cnblogs.com/qinziang/p/9241506.html
Copyright © 2011-2022 走看看