leetcode_350(求两个数组的交集)

一,题目大意
给定两个数组,编写函数计算它们的交集。

注意:

结果中的每个元素的出现次数应与其在两个数组中同时出现的次数一样多。
结果可以采用任意顺序。

进一步思考:

如果数组已经排好序,怎样优化你的算法?
如果nums1的长度<nums2的长度?哪一种算法更好?
如果nums2的元素存储在磁盘上,并且内存大小有限,不足以将其一次性的加载到内存中。此时应当怎样做?

二,分析

1,这道题目和之前的一道题目很像,有一点不同的是:这里交集可以重复。
点击这里:之前的一个题目,也是求交集

2,同样的,这里可以用list遍历,也可以用map去计数。接下来会相应的讨论。

3,这里也可先排序后再处理

三、java处理

1,list方法:

public static int[] intersect(int[] nums1, int[] nums2) {
        List<Integer> num1 = new ArrayList<Integer>();
        List<Integer> res = new ArrayList<>();
        for(int i=0;i<nums1.length;i++) {
            num1.add(nums1[i]);
        }
        for(int i=0;i<nums2.length;i++) {
            if(num1.contains(nums2[i])) {
                res.add(nums2[i]);
                num1.remove(nums2[i]);
            }
        }

        int[] result = new int[res.size()];
        for(int i=0;i<res.size();i++) {
            result[i] = res.get(i);
        }
        return result;
    }

2,map计数法:

public static int[] intersect2(int[] nums1, int[] nums2){
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        Vector<Integer> res = new Vector<>();
        for(int a : nums1) {
            if(map.get(a) == null) 
                map.put(a, 1);
            else 
                map.put(a, map.get(a) + 1);//计数
        }
        for(int a : nums2) {
            if(map.get(a) != null && map.get(a) > 0) {
                map.put(a, map.get(a) - 1);
                res.add(a);
            }
        }
        int[] result = new int[res.size()];
        for(int i=0;i<res.size();i++) {
            result[i] = res.get(i);
        }
        return result;

3,先排序(最快):

public static int[] intersect2(int[] nums1, int[] nums2){
        Arrays.sort(nums1);//排序
        Arrays.sort(nums2);
        ArrayList result = new ArrayList();
        for (int i = 0, j = 0; i < nums1.length && j < nums2.length; ){
            if (nums1[i] == nums2[j]){
                result.add(nums1[i]);
                i++;
                j++;
            } else if (nums1[i] < nums2[j]) {
                i++;
            } else {
                j++;
            }
        }
        int[] res = new int[result.size()];
        for (int i = 0; i < result.size(); i++){
            res[i] = (int) result.get(i);
        }
        return res;
    }

四、python解决

1,先排序

lass Solution(object):
    def intersect(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: List[int]
        """
        nums1, nums2 = sorted(nums1), sorted(nums2)
        p1 = p2 = 0
        ans = []
        while p1 < len(nums1) and p2 < len(nums2):
            if nums1[p1] < nums2[p2]:
                p1 += 1
            elif nums1[p1] > nums2[p2]:
                p2 += 1
            else:
                ans += nums1[p1],
                p1 += 1
                p2 += 1
        return ans

2,map计数,不过用的是Counter(很快)

这里同时回答了思考题2,3

class Solution(object):
    def intersect(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: List[int]
        """
        if len(nums1) > len(nums2):
            nums1, nums2 = nums2, nums1
        c = collections.Counter(nums1)//计数
        ans = []
        for x in nums2:
            if c[x] > 0:
                ans += x,
                c[x] -= 1
        return ans
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值