1.有效的字母异位词classSolution{public:boolisAnagram(string s,string t){unordered_mapchar,intmymap;for(autoc:s){mymap[c]mymap[c]1;}for(autoc:t){mymap[c]mymap[c]-1;}for(autoitem:mymap){if(item.second!0){returnfalse;}}returntrue;}};2.两个数组的交集classSolution{public:vectorintintersection(vectorintnums1,vectorintnums2){unordered_setintmyset;for(intnum:nums1){myset.insert(num);}unordered_setintresult_set;for(intnum:nums2){if(myset.count(num)0){result_set.insert(num);}}vectorintresult(result_set.begin(),result_set.end());returnresult;}};3.快乐数不能成为快乐数 即使之前拼接成的sum再次出现过 用set收集没有出现过的sum即可 一旦之前出现过直接返回false#includestdlib.h#includestdio.hclassSolution{public:boolisHappy(intn){string strto_string(n);unordered_setintmyset;while(true){intsum0;for(charc:str){sumpow(c-0,2)sum;}if(sum1){returntrue;}if(myset.count(sum)0){returnfalse;}myset.insert(sum);strto_string(sum);}returnfalse;}};4.两数之和就是一个用map储存已经遍历过的值 unordered_mapvalue,index mymap; 遍历过程中 如果map中存在和当前遍历元素和是target 直接返回即可题目说 答案唯一classSolution{public:vectorinttwoSum(vectorintnums,inttarget){unordered_mapint,intmymap;for(inti0;inums.size();i){if(mymap.count(target-nums[i])0){return{mymap[target-nums[i]],i};}else{mymap[nums[i]]i;}}return{};}};5.四数相加II将四数相加分解成 两个集合相加 每个集合里面有两个数组classSolution{public:intfourSumCount(vectorintnums1,vectorintnums2,vectorintnums3,vectorintnums4){unordered_mapint,intmymap;for(inti0;inums1.size();i){for(intj0;jnums2.size();j){mymap[nums1[i]nums2[j]]mymap[nums1[i]nums2[j]]1;}}// for(auto item:mymap){// coutfirst:item.first seconde:item.secondendl;// }coutendl;intcount0;for(intk0;knums3.size();k){for(intl0;lnums4.size();l){inttarget0-nums3[k]-nums4[l];if(mymap.count(target)0){countcountmymap[target];}}}returncount;}};7.赎金信主要思路 用map储存magazine每个元素以及统计元素出现的次数 遍历ransomNote 判断map是否含有该元素以及剩余次数是否还有classSolution{public:boolcanConstruct(string ransomNote,string magazine){unordered_mapchar,intmymap;for(autoc:magazine){mymap[c]mymap[c]1;}for(autoc:ransomNote){if(mymap.count(c)0||mymap[c]0){returnfalse;}else{mymap[c]mymap[c]-1;}}returntrue;}};8.三数之和方法一先排序双指针这里不适用哈希的原因是去重非常复杂 现对原先数组进行排序 使用双指针去重则非常简单去重第一个位置去重if(i-10nums[i]nums[i-1]){continue;}第二个元素以及第三个元素去重while(j1nums.size()nums[j]nums[j1]){j;}j;while(k-10nums[k]nums[k-1]){k--;}k--;完整代码classSolution{public:vectorvectorintthreeSum(vectorintnums){sort(nums.begin(),nums.end(),[](intnum1,intnum2){returnnum1num2;});vectorvectorintresult;for(inti0;inums.size();i){if(i-10nums[i]nums[i-1]){continue;}intji1;intknums.size()-1;inttarget0-nums[i];while(jk){if(nums[j]nums[k]target){k--;}elseif(nums[j]nums[k]target){j;}elseif(nums[j]nums[k]target){result.push_back({nums[i],nums[j],nums[k]});while(j1nums.size()nums[j]nums[j1]){j;}j;while(k-10nums[k]nums[k-1]){k--;}k--;}}}returnresult;}};方法二回溯法会超时a.用used去重回溯法 用·used更加普遍classSolution{public:// 回溯vectorvectorintres;vectorintpath;voidbacktracking(vectorintnums,vectorboolused,intstartindex,intcursum){if(path.size()3){if(cursum0){res.push_back(path);}return;}for(intistartindex;inums.size();i){//排序 数值去重if(i-10nums[i]nums[i-1]used[i-1]false){continue;}path.push_back(nums[i]);cursumcursumnums[i];used[i]true;backtracking(nums,used,i1,cursum);used[i]false;cursumcursum-nums[i];path.pop_back();}}vectorvectorintthreeSum(vectorintnums){sort(nums.begin(),nums.end(),[](inta,intb){returnab;});vectorboolused(nums.size(),false);backtracking(nums,used,0,0);returnres;}};b.用istartindex去重classSolution{public:// 回溯vectorvectorintres;vectorintpath;voidbacktracking(vectorintnums,intstartindex,intcursum){if(path.size()3){if(cursum0){res.push_back(path);}return;}for(intistartindex;inums.size();i){//排序 数值去重if(istartindexnums[i]nums[i-1]){continue;}path.push_back(nums[i]);cursumcursumnums[i];backtracking(nums,i1,cursum);cursumcursum-nums[i];path.pop_back();}}vectorvectorintthreeSum(vectorintnums){sort(nums.begin(),nums.end(),[](inta,intb){returnab;});backtracking(nums,0,0);returnres;}};9.四数之和这里就是固定a,b的位置 然后双指针移动c和d注意防止移除情况// 这里这么些 是因为测试用例里面有int最小值 防止溢出longintnewtargert(longint)target-(longint)nums[a]-(longint)nums[b];完整代码classSolution{public:vectorvectorintfourSum(vectorintnums,inttarget){sort(nums.begin(),nums.end(),[](intnum1,intnum2){returnnum1num2;});vectorvectorintresult;for(inta0;anums.size();a){if(a-10nums[a]nums[a-1]){continue;}for(intba1;bnums.size();b){if(b-1a1nums[b]nums[b-1]){continue;}// 这里这么些 是因为测试用例里面有int最小值 防止溢出longintnewtargert(longint)target-(longint)nums[a]-(longint)nums[b];intcb1;intdnums.size()-1;// cout a:a b:b c:c d:dendl;while(cd){// cout nums[c]:nums[c] nums[d]:nums[d] newtargert:newtargertendl;if(nums[c]nums[d]newtargert){d--;}elseif(nums[c]nums[d]newtargert){c;}else{result.push_back({nums[a],nums[b],nums[c],nums[d]});while(c1nums.size()nums[c]nums[c1]){c;}c;while(d-10nums[d]nums[d-1]){d--;}d--;}}}}returnresult;}};