两数组的交

原创 2016年06月02日 11:56:14

题目描述:返回两个数组的交

样例:nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2].

这个题的意思是返回两个数组中相同的数,但是不包含重复。

题目本身太简单了,但是方法有很多,其实题目的挑战也就在于用多种方法实现这个功能,在这里,我为大家介绍3种方法;

1. 集合

2. 哈希表

3. 排序+两根指针


先说使用集合数据类型,这是最简单的方法,直接求取两个数组元素的集合,再对两个集合求交。总共就两行代码:

class Solution:
    # @param {int[]} nums1 an integer array
    # @param {int[]} nums2 an integer array
    # @return {int[]} an integer array
    def intersection(self, nums1, nums2):
        return list(set(s1) & set(s2))
        # Write your code here

再说第二种方法,使用哈希表,先遍历第一个数组,用哈希表存储他的所有元素(这当然是去重之后的了),再遍历第二个数组,与哈希表比对,若在哈希表中,则添加到结果列表,同时删除哈希表的对应键值对(以免二次重复添加到结果列表),代码如下:

class Solution:
    # @param {int[]} nums1 an integer array
    # @param {int[]} nums2 an integer array
    # @return {int[]} an integer array
    def intersection(self, nums1, nums2):
        hash_table = {}
        result = []
        hash_table.fromkeys(nums1)
        for i in nums2:
            if len(hash_table) == 0:
                break
            if i in hash_table:
                result.append(i)
                hash_table.pop(i)
        return result
        # Write your code here


第三种方法最麻烦,然而也最考编程能力,就是先对两个数组排序,然后同时用两个指针遍历两个数组,查找到相同的元素,则添加到结果列表,需要注意的是可以通过while循环去重。代码如下:

class Solution:
    # @param {int[]} nums1 an integer array
    # @param {int[]} nums2 an integer array
    # @return {int[]} an integer array
    def intersection(self, nums1, nums2):
        result = []
        nums1.sort()
        nums2.sort()
        index1, index2 = 0, 0
        n1, n2 = len(nums1), len(nums2)

        if n1 == 0 or n2 == 0:
            return []

        while index1 < n1 and index2 < n2:
            if nums1[index1] == nums2[index2]:
                temp = nums1[index1]
                result.append(temp)
                while index1 < n1 and nums1[index1] == temp:
                    index1 += 1
                while index2 < n2 and nums2[index2] == temp:
                    index2 += 1
            elif nums1[index1] > nums2[index2]:
                index2 += 1
            else:
                index1 += 1
        return result
        # Write your code here
需要注意的是,19-22行的两个循环是查找下一个不同的元素


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

547.Intersection of Two Arrays-两数组的交(容易题)

两数组的交 题目返回两个数组的交 样例nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2]. 挑战可以用三种不同的方法实现吗? 题解 1.暴力解法O(N^2),会...

Java实现-两数组的交2

计算两个数组的交  注意事项 每个元素出现次数得和在数组里一样 答案可以以任意顺序给出 您在真实的面试中是否遇到过这个题?  Yes 样例 ...

两数组的交

返回两个数组的交  注意事项 Each element in the result must be unique. The result can be in any order....

两数组的交

返回两个数组的交  注意事项 Each element in the result must be unique. The result can be in any order. 样例 ...

[hdu 5700 区间交]树状数组+二分

[hdu 5700 区间交]树状数组+二分知识点:data structure binary index tree1. 题目链接[hdu 5700 区间交] 类似题目:[Codeforces 754...

hdu 5700 区间交(树状数组+二分)

题目地址:点击打开链接 思路:对左端点进行排序,然后一边更新,一边查询。因为按左端点排序,所以左端点可以作为相交区间的左端点,然 后可以根据是否被大于等于k次覆盖二分查找k个区间覆盖的最大的右端点...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)