算法题每日一练---第83天:两个数组的交集 II

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第17天,点击查看活动详情

一、问题描述

给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。

题目链接:两个数组的交集 II

二、题目要求

样例 1

输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2,2]
复制代码

样例 2

输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [4,9]
复制代码

考察

1.暴力、哈希
2.建议用时15~30min
复制代码

三、问题分析

1.暴力法

通常来说,计算机1s可以运行 1 e + 8 1e+8 次,这一题的范围是 1 e + 3 1e+3 ,双重for循环不会超时,先来暴力搞一波。

我只需要先遍历一个数组nums素是否在nums2里面。

如果在的话,值插入第三个数组,并将nums2的值置为-1,防止重复。

2.哈希

3.gif

题目中数组的每个元素不是唯一的,先用哈希表存储nums1出现的数字次数。

遍历nums2找寻数字是否在哈希表出现过,如果-1,存储数据。

四、编码实现

1.暴力法

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        int i,j,m=nums1.size(),n=nums2.size();//初始化数据
        vector<int>v;
        for(i=0;i<m;i++)//遍历其中一个数组
        {
            for(j=0;j<n;j++)
            {
                if(nums1[i]==nums2[j])//如果相等
                {
                    v.push_back(nums1[i]);//插入第三个数组
                    nums2[j]=-1;//置为-1
                    break;//退出这层循环
                }
            }
        }
        return v;
    }
};
复制代码

2.哈希

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        int i;//初始化数据
        vector<int>v;
        map<int,int>m;//哈希计数
        for(i=0;i<nums1.size();i++)//遍历其中一个数组
            m[nums1[i]]++;
        for(i=0;i<nums2.size();i++)//判断第二个数组
        {
            if(m[nums2[i]]>0)//存在数据
            {
                v.push_back(nums2[i]);//存储
                m[nums2[i]]--;//计数-1
            }
        }
        return v;
    }
};
复制代码

五、测试结果

1.png

2.png

执行用时少了一半,这叫牺牲空间换时间。

猜你喜欢

转载自juejin.im/post/7087561274459947045