350. Intersection of Two Arrays

2018-12-12  本文已影响0人  cca1yy

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

Note:结果中每个元素出现的次数应与它同时出现在两个数组中的次数相同。结果可以是任意顺序的。

进一步思考:

如果数组已经排好序,怎样优化你的算法?

如果nums1的长度<nums2的长度?哪一种算法更好?

如果nums2的元素存储在磁盘上,并且内存大小有限,不足以将其一次性的加载到内存中。此时应当怎样做?

解题思路1:先将两个数组按照从小到大的顺序排序。然后使用两个指针 l 和 r分别遍历两个数组 nums1 和 nums2, 若二者对应元素相等,则 指针l 的值赋给result(初始为[]),且指针l 和指针r 都向后移一位。若nums1[l] < nums2[r], 则l 向右移一位。 若nums1[l] > nums2[r],则r向右移一位。

代码如下:

解题思路2:其实按照题意,不应该先对字符串进行排序然后再进行后续操作。那么如果想在不排序的情况下完成题目要求,应该怎么做呢?

看到了使用hash的方法。参考:https://www.jianshu.com/p/282529fd4d9f

先对字符串1生成hash结果,统计每个字符出现的次数。然后遍历字符串2,如果字符串2中的字符出现在字符串1中,则减少hash结果中该字符的次数,并且把这个字符加入到结果集合中。这里如果要对中间结果的空间进行节省,建议对字符串长度短的那个进行hash(并不能保证短的那个出现的字符少,但通常这样认为)。

使用Collections模块的Counter类,目的是用来跟踪值出现的次数。Counter类是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)。

代码如下:

解题思路3:直接使用collections模块中Counter类的算术和集合操作。

应用于题目的代码如下:

上一篇下一篇

猜你喜欢

热点阅读