[Leetcode 349]Intersection of Two Arrays

题目描述:

Given two arrays, write a function to compute their intersection.

Example:
Given nums1 = [1, 2, 2, 1]nums2 = [2, 2], return [2].

Note:

  • Each element in the result must be unique.
  • The result can be in any order.

解题思路(1):题意要我们找出俩个数组的共同部分,并且保存不重复的值,第一种方法我们可以将俩个数组都进行排序(当碰到数组问题,排序后一定会比 不排序有思路,好做(只要运行复杂度在排序复杂度之内即可)),那么我们可以用俩个指针来指向俩个数组,碰到相等的时候,就记录,但是注意由于结果是不重复的,那么我保存结果用集合即可,此算法时间复杂度为0(m+n),假设m,n分别为俩个数组的长度~java代码如下:

public class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> set = new HashSet<>();
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        int i = 0;
        int j = 0;
        while (i < nums1.length && j < nums2.length) {
            if (nums1[i] < nums2[j]) {
                i++;
            } else if (nums1[i] > nums2[j]) {
                j++;
            } else {
                set.add(nums1[i]);
                i++;
                j++;
            }
        }
        int[] result = new int[set.size()];
        int k = 0;
        for (Integer num : set) {
            result[k++] = num;
        }
        return result;
    }
}


解题思路(2):当涉及到查找问题的时候,就可以想到在一个数组中固定,另一个数组排序好,然后采用二分查找的过程~结果用集合来表示(防止结果重合)


解题思路(3):用hash来做,扫描第一个数组的时候,记录在hash表中,然后扫描第二个数组,碰到大于0的就记录,并且此时立即清空,为了防止记录重复的,C++,python代码如下


C++代码:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        vector<int>res;
        map<int,int>Map;
        int len1 = nums1.size(),len2 = nums2.size(),i;
        for(i = 0;i<len1;i++)
        {
            Map[nums1[i]]++;
        }
        for(i = 0;i<len2;i++)
        {
            if(Map[nums2[i]]>0)
            {
                res.push_back(nums2[i]);
                Map[nums2[i]] = 0;     //因为它不允许重复的,那么在这里就一定要清零
            }
        }
        return res;
    }
};

python代码:

class Solution(object):
    def intersection(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: List[int]
        """
        len1 = len(nums1)
        len2 = len(nums2)
        Map = {}
        res = []
        for i in range(len1):
            if nums1[i] not in Map:
                Map[nums1[i]]=1
            else:
                Map[nums1[i]]+=1
        for i in range(len2):
            if nums2[i] in Map:
                res.append(nums2[i])
                del Map[nums2[i]]      #删除了为nums2[i]这项
        return res
            


知乎主页:忆臻
专栏地址:机器学习算法
博客地址: 忆臻博客


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值