LeetCode350

news/2024/11/23 22:50:29/

两个数组的交际2

1. 题目描述

给你两个整数数组nums1和nums2,请你以数组的形式返回两数组的交集。返回结果中每个元素出现的次数,英语元素在两个数组中都出现的次数一致。可以不考虑输出结果的顺序。

示例
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]

2. 解法

2.1 我的解法-双map

一开始我的思路是:我想要统计每个数组中每个元素出现的次数,然后对比这两份统计结果,取其中较小的次数填入答案。

由于要统计元素出现的次数,我想到了map或者数组。以示例为例,定义空的map1和map2。首先遍历nums1,nums1中元素代表map1中的key值,遍历到了,就在map1对应key处加1.所以遍历完两个数组后map1=[2,2],map2=[0,2]。然后对比两张map,在都有value的地方选取较小的value作为交集中该key出现的次数填入交集。

在这里插入图片描述

代码如下:

class Solution {
public:vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {vector<int> ans;map<int,int> m1, m2;for(int r:nums1)//遍历nums,统计各元素出现的次数{++m1[r];} for(int r:nums2){++m2[r];}for(int i=0;i!=(m1.size()<m2.size()?m1.size():m2.size());++i)//循环次数为m中大小较小的值{m1[i]=m1[i]<m2[i]?m1[i]:m2[i];//只选取较小的值保留下来if(m1[i])//如果m[i]处value不为0{for(int j=0;j!=m1[i];++j)以该value为次数填入数据{ans.push_back(i);}}}return ans;}
};

执行用时16ms,内存消耗12.1MB。

2.2 单map,优化一下

如果我只统计一个数组中元素出现的次数,然后遍历另一个数组,以这个数组的元素值为key搜索map。如果map[key]不为0,就代表这两个数组出现了重复元素一次。这个时候–map[key],将key添加进答案,不就完成这道题了吗?第一次遍历的数组可以选取长度较短的数组。

class Solution {
public:vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {if(nums1.size()>nums2.size()) return intersect(nums2,nums1);//选取较短的数组作为第一个参数vector<int> ans;map<int,int> m1;for(int r:nums1){++m1[r];} for(int r:nums2){if(m1.find(r)->second){ans.push_back(r);--m1[r];}}return ans;}
};

执行用时4ms,内存消耗10.2MB。

2.3 双指针

这里双指针用法与之前类似。之前是快慢指针,在同一个数组中,这里换成了不同数组。首先将两个数组排序。定义两个指针分别指向两个数组的起始位置。解引用指针判断是否相等,相等的话就将该值填入答案,然后两个指针均+1;不等的话,指向较小值的指针++,另一个不动。结束循环的条件为其中一个指针指向了end()。

class Solution {
public:vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {sort(nums1.begin(),nums1.end());sort(nums2.begin(),nums2.end());vector<int>::iterator it1 = nums1.begin(), it2 = nums2.begin();vector<int> ans;while(it1!=nums1.end() && it2!=nums2.end()){if(*it1 == *it2){ans.push_back(*it1);++it1;++it2;}else{*it1 < *it2 ? ++it1 : ++it2;}}return ans;}
};

http://www.ppmy.cn/news/274583.html

相关文章

js实现转盘抽奖

js实现转盘抽奖 一、效果图二、设计思路三、核心代码 一、效果图 二、设计思路 第一步&#xff1a;先建立所有奖品的集合&#xff0c;设置默认转的圈数第二步&#xff1a;设置转动的随机角度第三步&#xff1a;转动到哪里就是最后的奖品&#xff0c;使用浏览器弹框弹出第四步&a…

html+js抽奖转盘解析(简单)

之前在公司一直写小程序&#xff0c;最近项目跟进&#xff0c;新加了抽奖转盘的H5页面&#xff0c;想了想&#xff0c;简单梳理一下逻辑&#xff0c;我用的是自己写的最简单的方式。 先看具体需求样式 作为一个资&#xff08;c&#xff09;深&#xff08;v&#xff09;工程师的…

CF 15D Map

转载请注明出处&#xff0c;谢谢http://blog.csdn.net/ACM_cxlove?viewmodecontents by---cxlove 题意&#xff1a;给出一个n*m的矩阵&#xff0c;每次选取一个a*b的矩阵&#xff0c;要求所有元素与最小的元素差的和最小。 http://codeforces.com/problemset/problem/15/…

JS实现抽奖转盘

超级简单的原理&#xff1a; 点击转盘指针后随机得到一个数(每个数字对应一个奖项),并确定每个奖项在轮盘上的大概角度&#xff0c;然后调用 jqueryRotate.js插件来转动轮盘&#xff0c;并停在奖品的对应角度。 使用的插件 jquery.js jqueryRotate.js //旋转插件 附赠链家&…

Gift 题解

题目描述 Input 输入的第一行为一个整数t。   接下来t行&#xff0c;每行包含九个自然数。 Output 输出t行   每行一个整数&#xff0c;表示2^a2^b2^c2^d2^e2^f2^g2^hi。 Sample Input 1 21 30 0 0 0 0 0 0 2147483647 Sample Output 3223322629 Data Constraint…

Automader 使用教程 - 01 你好,左右抽

Automader 项目地址&#xff1a;Gitee 码云 项目简介 Automader 项目最开始只是给我自己使用的 Python 小工具&#xff0c;但是想着为音 mad 社区作出一点自己的共享&#xff0c;因此就把它的源代码放在了码云上面。 这个项目受到了 Manim 的一些影响&#xff0c;再加上自己…

简易抽奖网页

简易抽奖网页需要完成以下几个功能&#xff1a; * 1.简单的网页界面设计 * 2.回车开始抽取再次回车暂停 * 3.三次抽取后结束 * 4.ESC键重新抽取 界面设计部分不赘述 实现思想&#xff08;JavaScripts部分&#xff09;&#xff1a; 1. 设计一个数组存放被抽取人员的…

CF550B Preparing Olympiad 题解

同我在洛谷的博客 洛谷题目传送门 与这道题相近的题目是&#xff1a;洛谷P2036 [COCI2008-2009#2] PERKET &#xff08;大家可以看一下这道题&#xff09; 题目大概就是&#xff1a;给定 n n n 个数&#xff0c;从中选出一些数&#xff0c;保证这些数之和在 [ l , r ] [l,…