集合和字典:集合的常见形式是Set,字典的常见形式是MapSet和Map。主要应用场景在于数据重组和数据存储。集合和字典的区别:共同点:集合和字典可以存储不重复的值。区别:集合类似于数组,元素只有键没有值,值就是键。字典以[key,value]的形式存储。键的范围不限于字符串,各种类型的值(包括对象)都可以作为键。时间复杂度:Set或map可以使用一个哈希表或平衡两个Fork搜索树实现哈希表实现的map或set搜索的时间复杂度为O(1)。哈希表的优点是查找速度非常快。哈希表的缺点是丢失了数据的顺序,平衡了二分查找。树实现的map或setlookup时间复杂度为O(logn),保证了数据的顺序性。散列函数散列函数是接受输入值并从该输入计算出确定输出的函数。均匀分布:哈希函数计算出的地址是均匀分布的哈希冲突:哈希函数计算出的结果冲突开放式寻址法链式寻址法447.给定平面上的回旋镖(中)n对不同点的个数,其中points[i]=[xi,yi]。回旋镖是由点(i,j,k)表示的元组,其中i和j之间的距离等于i和k之间的欧氏距离(需要考虑元组的顺序)。返回飞机上所有回旋镖的数量。示例1:输入:points=[[0,0],[1,0],[2,0]]输出:2解释:两个回旋镖是[[1,0],[0,0],[2,0]]和[[1,0],[2,0],[0,0]]示例2:输入:points=[[1,1],[2,2],[3,3]]输出:2示例3:输入:points=[[1,1]]输出:0提示:n==points.length1<=n<=500points[i].length==2-104<=xi,yi<=104Allpointsaredifferenteachother思路:循环遍历数组,找到与当前元素距离相同的点,记录频率并添加到地图中,最后循环地图,从数字中选择两个组合与相同的距离,并将其添加到结果中。从m个元素中选出两个的排列组合次数为m*(m-1)复杂度:时间复杂度O(n^2),数组遍历两层,空间复杂度O(n),哈希表空间js://m={1:3,2:5}varnumberOfBoomerangs=function(points){让ans=0;for(constpofpoints){constm=newMap();for(constqofpoints){//统计当前点到地图距离相同的个数constdis=(p[0]-q[0])*(p[0]-q[0])+(p[1]-q[1])*(p[1]-q[1]);m.set(dis,(m.get(dis)||0)+1);}for(const[_,item]ofm.entries()){//从相同距离的点数中选择两个ans+=item*(item-1);}}返回答案;};49.anagramgrouping(medium)givesyouacharacter一个字符串数组,您可以在其中将字谜组合在一起。结果列表可以按任何顺序返回。字谜是通过重新排列源词的字母而获得的新词,通常在所有源词中恰好出现一次。示例1:输入:strs=["eat","tea","tan","ate","nat","bat"]输出:[["bat"],["nat","tan"],["ate","eat","tea"]]示例2:输入:strs=[""]输出:[[""]]示例3:输入:strs=["a"]输出:[["a"]]Tips:1<=strs.length<=1040<=strs[i].length<=100strs[i]只包含小写字母方法1.排序思路:遍历字符串数组,对每个字符串中的字符in被排序并添加到映射对应的键数组中。复杂度:时间复杂度O(n*klogk),n为字符串个数,k为最长字符串长度,排序复杂度O(klogk),排序n次,哈希表更新O(1)。空间复杂度O(nk),排序空间复杂度O(nlogk),映射空间复杂度O(nk),取大的O(nk)js:vargroupAnagrams=function(strs){constmap=newMap();for(letstrofstrs){letarray=Array.from(str);//将字符放入数组array.sort();//排序letkey=array.toString();让列表=map.get(键)?map.get(key):newArray();//从map中获取对应的数组list.push(str);//添加到数组中map.set(key,list);//重置字符数组}returnArray.from(map.values());//将map中的值转为数组};方法二、统计思路:题意是字符串的字符都是小写的,可以统计每个字符在字符串中出现的频率,将每个字符出现频率相同的字符串放在一组.复杂度:时间复杂度O(n*k),n为字符串个数,k为最长字符串长度,循环字符数组的复杂度为O(n),每个字符串的频率复杂度为O(k).空间复杂度为O(n*k),最长长度为k的n个字符串存储在map中。js:vargroupAnagrams=function(strs){constmap={};for(letsofstrs){//循环字符串数组constcount=newArray(26).fill(0);//字符全部小写,初始化一个大小为26的数组for(letcofs){//统计字符串中每个字符出现的频率count[c.charCodeAt()-'a'.charCodeAt()]++;}地图[计数]?map[count].push(s):map[count]=[s];//添加到地图}returnObject.values(map);};242.Validanagrams(easy)giventwo给定字符串s和t,编写一个函数来确定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)空间。我们忽略这种复杂性,它取决于不同的语言实现细节。undefined示例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);}}返回ans;};454。四数加法二(中)给你四个整数数组nums1、nums2、nums3和nums4,数组的长度为n,请计算有多少元组(i,j,k,l)可以满足:0<=i,j,k,l
