当前位置: 首页 > Web前端 > JavaScript

使用javascript对leetcode16.set&map进行分类(图文视频讲解)_0

时间:2023-03-27 15:27:02 JavaScript

集合和字典:集合的常见形式是Set,字典的常见形式是MapSet和Map。主要应用场景在于数据重组和数据存储。集合和字典的区别:共同点:集合和字典可以存储不重复的值。区别:集合类似于数组,元素只有键没有值,值就是键。字典以[key,value]的形式存储。键的范围不限于字符串,各种类型的值(包括对象)都可以作为键。时间复杂度:Set或map可以使用一个哈希表或平衡两个Fork搜索树实现哈希表实现的map或set搜索的时间复杂度为O(1)。哈希表的优点是查找速度非常快。哈希表的缺点是丢失了数据的顺序,平衡了二分查找。树实现的map或setlookup时间复杂度为O(logn),保证了数据的顺序性。散列函数散列函数是接受输入值并从该输入计算出确定输出的函数。均匀分布:哈希函数计算出的地址均匀分布哈希冲突:哈希函数计算出的结果冲突,写一个函数判断t是否是s的变位词。注意:如果每个字符在s和t中出现的次数相同,则称s和t是彼此的变位词。示例1:输入:s="anagram",t="nagaram"输出:true示例2:输入:s="rat",t="car"输出:false提示:1<=s.length,t.length<=5*104s和t只包含小写字母进阶:如果输入字符串包含unicode字符怎么办?你能调整你的解决方案来处理这个问题吗?方法一、排序思路:将两个字符串转成一个数组,排序后再转回字符串进行比较。复杂度分析:时间复杂度O(nlogn),排序采用快速排序,时间复杂度为nlogn,比较两个字符串是否相等时间复杂度为n,O(n)+O(nlogn)=O(nlogn)。空间复杂度为O(logn),排序需要O(logn)的空间。java和js的字符串是不可变的,复制字符串需要额外的O(n)空间。我们忽略这种复杂性,它取决于不同的语言实现细节。方法二、哈希表:思路:采用空间换时间的策略,准备一个数组,循环字符串s,每出现一个元素就加1,然后循环t元素,每出现一个字符就减1,如果t出现一些不在s中的字符返回false,所有循环结束说明两个字符串中每个字符的个数相同复杂度分析:时间复杂度O(n),n为字符串长度,空间复杂度O(s),s为字符集大小js:varisAnagram=function(s,t){if(s.length!==t.length){//长度不想返回falsereturnfalse;}consttable=newArray(26).fill(0);//大小为26的数组for(leti=0;inums1[0]+nums2[0]+nums3[0]+nums4[1]=1+(-2)+(-1)+2=0(1,1,0,0)->nums1[1]+nums2[1]+nums3[0]+nums4[0]=2+(-1)+(-1)+0=0示例2:输入:nums1=[0],nums2=[0],nums3=[0],nums4=[0]输出:1提示:n==nums1。lengthn==nums2.lengthn==nums3.lengthn==nums4.length1<=n<=200-228<=nums1[i],nums2[i],nums3[i],nums4[i]<=228方法1:哈希表思路:取出A和B中两个数的组合,以这两个数的和为key,将出现的次数作为value加入到哈希表中,循环C和D,判断是否有C和D中两个数的和加上AB中两个元素的和正好为0,统计组合的复杂度:时间复杂度O(n^2),两个嵌套循环空间复杂度O(n^2),哈希表的空间,最坏情况下是n^2js:varfourSumCount=function(A,B,C,D){constcountAB=newMap();//从A和B中取出两个数的组合,以这两个数的和为key,将出现的次数作为value加入哈希表,A.forEach(u=>B.forEach(v=>countAB.set(u+v,(countAB.get(u+v)||0)+1)));让ans=0;for(letuofC){//循环C,Dfor(letvofD){if(countAB.has(-u-v)){//判断C和D中是否有两个数加上和AB中两个元素的恰好为0ans+=countAB.get(-u-v);//累加组合数}}}returnans;};187.重复的DNA序列(中)DNA序列由一系列核苷酸组成,缩写为“A”、“C”、“G”和“T”。例如,“ACGAATTCCG”是一个DNA序列。在研究DNA时,识别DNA中的重复序列非常有用。给定一个表示DNA序列的字符串s,返回在DNA分子中出现不止一次的所有长度为10的序列(子字符串)。您可以按任何顺序返回答案。示例1:输入:s="AAAAACCCCCAAAAACCCCCCAAAAAAGGGTTT"输出:["AAAAACCCCC","CCCCCAAAAA"]示例2:输入:s="AAAAAAAAAAAAAA"输出:["AAAAAAAAAA"]提示:0<=s.length<=105s[i]=='A','C','G'or'T'思路:用map存储子串出现的次数,循环dna序列,每次截取长度为10的子串,相加ittothemapandupdatetheappearance的次数,如果次数超过2,加上ans复杂度:时间复杂度O(n),n是字符串的长度。空间复杂度O(n)js:varfindRepeatedDnaSequences=function(s){constL=10;常数ans=[];constcnt=newMap();constn=s.length;for(leti=0;i<=n-L;++i){constsub=s.slice(i,i+L)//截取一个长度为10的子串cnt.set(sub,(cnt.get(sub)||0)+1);//加入地图并更新出现次数if(cnt.get(sub)===2){ans.push(sub);}}返回答案;};1。两数之和(简单)给定一个整数数组nums和一个整数目标值target,请在数组中找出和为目标值target的两个整数,并返回它们的数组下标。您可以假设每个输入只有一个答案。但是,数组中的相同元素不能在答案中重复出现。您可以按任何顺序返回答案。示例1:输入:nums=[2,7,11,15],target=9输出:[0,1]解释:因为nums[0]+nums[1]==9,返回[0,1]。示例2:输入:nums=[3,2,4],target=6输出:[1,2]示例3:输入:nums=[3,3],target=6输出:[0,1]提示:2<=nums.length<=104-109<=nums[i]<=109-109<=target<=109只有一个有效答案高级:你可以想出一个小于O(n2)算法?方法一、暴力枚举思路:两层for循环,第一层fori:0->n-1,枚举nums中的每个数x,第二层forj:i+1->n-1,求判断两个数之和是否为目标。复杂度分析:时间复杂度:O(n^2),n是数组的长度。空间复杂度O(1)。方法二、哈希表:动画过大,点击查看思路:方法一第一层循环是必须的,关键是优化第二层循环,也就是找到targrt-x的过程,关键在这里就是用空间换时间,也就是用哈希表优化,这样查找过程就变成了O(1)。首先遍历nums数组,然后在哈希表中寻找target-x。如果不存在,则将当前元素x和下标存入哈希表。如果存在,则返回target-x和当前元素的下标复杂度分析。:时间复杂度O(n),n是数组的长度,空间复杂度O(n),n是数组的长度,主要是哈希表的空间开销js:vartwoSum=function(nums,target){constmap=newMap();for(leti=0;i