利用go语言实现求数组交集的算法
计算两个数组的交集
这里说一下,我这里就用go语言来实现,别的语言也都可以
题目:给定两个数组,编写一个函数来计算它们的交集。(来自leecode(349))
示例1:
输入:nums1〔1,2,2,1〕,nums2〔2,2〕输出:〔2〕示例2:
输入:nums1〔4,9,5〕,nums2〔9,4,9,8,4〕输出:〔9,4〕
说明:输出结果中的每个元素都是唯一的。我们可以不考虑输出结果的顺序
这里看下有两个要求,一个是元素是唯一的,一个是不要求有顺序的,当我们看到这样的题目时,肯定会想到两个数组嵌套循环去判断,但是这样的话,时间复杂度就上去了,我就不写了,下面利用集合也可以当成标记法来实现,会好一些
我的解法:
下面这个解法,是比较容易看懂的packagemain省略main函数了funcGetInterect(num1,num2〔〕int)(res〔〕int){创建一个map用来存num1时出现的数,这里值可以任意类型的,推荐使用struct,我这里就使用int的set1:map〔int〕int{}for,v:rangenum1{set1〔v〕1}创建另一个map,来存储另一个num2里的值set2:map〔int〕int{}for,v:rangenum2{set2〔v〕1}思考?这里是循环数量少的数组呢还是循环数量大的数组呢?为什么选择的是循环数量少的呢?自己思考一下就能想明白了if(len(set1)len(set2)){set1,set2set2,set1这是go中的变量交换,是不是很牛p,不用第三方变量}现在set1就是那个数量少的了for,v:rangeset1{这一句是最最重要的,意思是,如果这个值在set2中出现,set2〔v〕会返回两个值,第一个是值,第二个返回是true或false,如果存在返回true,否则返回false,如果为true,则执行append函数添加到返回值数组中if,ok:set2〔v〕;ok{resappend(res,v)}}这里很奇怪,为啥只写一个return就可以,这里涉及到go里的一些内容,由于我在返回参数那里加上了res,所在这里可以不用写,如果不加,则得需要写上,这也是和别的语言不一样的地方return}进阶1
题目同上,只不过在输出的时候
输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
示例1:
输入:nums1〔1,2,2,1〕,nums2〔2,2〕输出:〔2,2〕示例2:
输入:nums1〔4,9,5〕,nums2〔9,4,9,8,4〕输出:〔9,4〕
想一想,这个咋弄?是不是可以当成只要是在两个数组中出现的次数一样,就能找出来了?那怎么记录每个元素出现的次数呢,使用map映射是不是可以实现,那key和value怎么记呢?其实我们可以元素当key,把元素出现的次数当value就行
解法
其实这个算法算是比较容易的,自己多看看就可以实现的了packagemain省略main函数了funcGetInterect(num1,num2〔〕int)(res〔〕int){定义一个map记录元素出现的次数m0:map〔int〕int{}for,v:rangenum1{m0〔v〕1元素出现一次就在原来的上面加1}for,v:rangenum2{ifm0〔v〕0{resappend(res,v)m0〔v〕1这一步不要忘记,当我们元素加到返回结果中,需要在map中的次数减一}}returnres}进阶2
如果给定的数组是排好序的,
arr1〔1,2,3,4,4,13〕,arr2〔1,2,3,9,10〕
那这个返回值该如何获取得两个数组的交集呢?想一想怎么实现,不但值是一样的,索引还得是一样的才可以,我们可以使用双指针的算法还实现应该可以
步骤一:如果两个索引上值一样,则把值放到返回结果中
步骤二:如果不一样,就让索引值小的那个索引,向后移动,再进行比较
步骤三:只要两个数组有一个已经到最后了,就停止循环退出
解法packagemainimportsortmain函数省略funcGetSortInterect(num1,num2〔〕int)(res〔〕int){对数组先进行排序sort。Ints(num1)sort。Ints(num2)len1,len2:len(num1),len(num2)初始化索引index1,index2:0,0退出循环条件,如下for(index1len1index2len2){if(num1〔index1〕num2〔index2〕){index2}elseif(num1〔index1〕num2〔index2〕){index1}else{相等的时候resappend(res,num1〔index1〕)}}return}这个解法应该还可以吧,也可以去leecode官网看看答案(第351题进阶)!
在工作中除了curd,有时间刷刷算法,看起来也还不错!
燕云台乌骨里为什么不姓萧乌骨里真实身份及结局揭秘目前,电视剧《燕云台》未播先火,剧中女主萧燕燕的姐妹乌骨里的身份大家十分的好奇,为何作为宰相萧思温的二女儿但是却不姓萧呢?这是为什么呢?乌骨里真实身份及结局揭秘,一起来看一下。……
燕云台韩德让萧燕燕有孩子么两人情路坎坷最终得以厮守《燕云台》这部剧目前虽然还没有开播,但是在网上关于这部剧的话题度很高,其中女主角萧燕燕的感情线颇受大家的关注,不少网友十分好奇韩德让和萧燕燕有孩子吗?据悉,两人情路坎坷最终得以……
朝鲜居民最常用APP为导航程序旅伴据韩联社报道,朝鲜英文周刊《平壤时报》1月31日消息称,朝鲜去年吸引移动用户最多的应用程序(APP)是三兴经济信息技术公司开发的地图导航程序旅伴3。1。除此之外,在线进行……
入手Mate40pro后的一点真实感受华为Mate40pro自上市以来,一直坚持了整整半年才在官方商城抢购成功,经过大半年的等待,最初的那份热情也减退了不少,除了因为价格定得高,还因为专注拍照的P50也临近发布,期……
燕云台萧胡辇嫁给了谁萧胡辇感情线及结局介绍近日,唐嫣主演的《燕云台》未播先火,剧中不仅仅唐嫣扮演的萧燕燕备受大家的关注,剧中同时萧氏姐妹的萧胡辇也是大家的关注的焦点,在这部剧当中,萧胡辇最后嫁给了谁呢?萧胡辇感情线及结……
该到消费了周末市场没啥大事,解读下相应消息面。1、发改委发布了《关于做好近期消费工作的通知》,通知里提出了十个方面的工作举措,其中重点强调了满足居民节日消费需求和扩大居民冰雪消费。……
正青春章小鱼最后和谁在一起了?正青春章小鱼扮演者是谁《正青春》是由吴谨言、殷桃、何润东等一众明星主演的一部都市职场剧,章小鱼这个角色是初入职场的新人,是一个职场菜鸟。但她敢想敢做,持有一颗努力单纯的初心。最后她不仅收获了事业,还……
2019暑期必看的几部电视剧谁才是你的暑期男友2019年的这个暑假,不少网友表示,这个暑假过得有点甜。从《亲爱的热爱的》到《陈情令》再到《小欢喜》,这里面谁才是你的ldquo;暑期男友rdquo;呢?一起来看一下吧!……
盘点周星驰十大经典喜剧盘点周星驰十大经典喜剧NO。10《审死官》导演:杜琪峰主演:周星驰,梅艳芳,吴家丽,吴孟达,秦沛,黄一飞剧情简介:影片主要讲述清朝时期官官相护,状师宋世……
盘点赵丽颖演过的32部电视剧你更喜欢哪一部呢?盘点赵丽颖演过的32部电视剧:你更喜欢哪一部呢?谁也想不到当初在还珠格格里扮演过配角晴格格的赵丽颖,现在摇身一变变超星女皇,是什么推动了她的发展,是外部原因还是自身演技过……
有什么好看的美剧经典好看的42部美剧推荐有什么好看的美剧:经典好看的43部美剧推荐好看的美剧有哪些,下面是我们收集的综合排名很好的43部美剧,最好看的美剧推荐给大家!1。《Friends》老友记【这就不用……
为什么所有人都觉得90后堕落?那些富豪榜单上的90后!币圈占二零一八年胡润百富榜90后首富二零一九年十月二十八日,胡润研究院正式地发布了《二零一九年胡润80后白手起家富豪榜》,葛越晟以35亿元的资产排名第32,其实早在去年的时候,这位年……