classSolution{public:boolisAnagram(string s, string t){
vector<int>hashVec(26,0);for(int i =0; i < s.size(); i++){
hashVec[s[i]-'a']++;}for(int i =0; i < t.size(); i++){
hashVec[t[i]-'a']--;}bool flag =true;for(int i =0; i < hashVec.size(); i++){if(hashVec[i]!=0){
flag =false;break;}}return flag;}};
leetcode 383 赎金信
classSolution{public:boolcanConstruct(string ransomNote, string magazine){
vector<int>hashVec(26,0);for(int i =0; i < magazine.size(); i++){
hashVec[magazine[i]-'a']++;}for(int i =0; i < ransomNote.size(); i++){
hashVec[ransomNote[i]-'a']--;}bool flag =true;for(int i =0; i < hashVec.size(); i++){if(hashVec[i]<0){
flag =false;break;}}return flag;}};
leetcode 49 字母异位词分组
classSolution{public:
vector<vector<string>>groupAnagrams(vector<string>& strs){
map<vector<int>, vector<string>> umap;
vector<vector<string>> result;for(int i =0; i < strs.size(); i++){
string str = strs[i];
vector<int> hashVec =convertStr(str);if(umap.find(hashVec)== umap.end()){
umap[hashVec]= vector<string>();}
umap[hashVec].push_back(str);}
map<vector<int>, vector<string>>::iterator it;for(it = umap.begin(); it != umap.end(); it++){
result.push_back(it->second);}return result;}
vector<int>convertStr(string str){
vector<int>hashVec(26,0);for(int i =0; i < str.size(); i++){
hashVec[str[i]-'a']++;}return hashVec;}};
classSolution{public:
vector<string>commonChars(vector<string>& words){
vector<int>hashVec(26,0);for(int i =0; i < words[0].size(); i++){
hashVec[words[0][i]-'a']++;}int hashOtherStr[26]={0};for(int i =1; i < words.size(); i++){memset(hashOtherStr,0,26*sizeof(int));//别忘了恢复hashOtherStr的状态for(int j =0; j < words[i].size(); j++){
hashOtherStr[words[i][j]-'a']++;}for(int k =0; k <26; k++){
hashVec[k]= hashVec[k]< hashOtherStr[k]? hashVec[k]: hashOtherStr[k];}}
vector<string> result;for(int k =0; k <26; k++){while(hashVec[k]){
string s(1, k +'a');//char -- string
result.push_back(s);
hashVec[k]--;}}return result;}};
leetcode 349 两个数组的交集
classSolution{public:
vector<int>intersection(vector<int>& nums1, vector<int>& nums2){
unordered_set<int> tmpSet;
unordered_set<int>uset(nums1.begin(), nums1.end());for(int i =0; i < nums2.size(); i++){if(uset.find(nums2[i])!= uset.end()){
tmpSet.insert(nums2[i]);}}
vector<int>result(tmpSet.begin(), tmpSet.end());return result;}};
leetcode 350 两个数组的交集II
classSolution{public:
vector<int>intersect(vector<int>& nums1, vector<int>& nums2){
vector<int> result;
unordered_map<int,int> umap;for(auto ele : nums1){
umap[ele]++;}for(auto ele : nums2){if(umap[ele]>0){
result.push_back(ele);
umap[ele]--;}}return result;}};
leetcode 202 快乐数
classSolution{public:boolisHappy(int n){
unordered_set<int> uset;while(1){int sum =getSum(n);if(sum ==1){returntrue;}else{if(uset.find(sum)!= uset.end()){returnfalse;}
uset.insert(sum);
n = sum;}}}intgetSum(int n){int sum =0;while(n){
sum +=(n %10)*(n %10);
n = n /10;}return sum;}};
leetcode 1 两数之和
classSolution{public:
vector<int>twoSum(vector<int>& nums,int target){
unordered_map<int,int> mp;//key无序 key不可重复
vector<int> result;for(int i =0; i < nums.size(); i++){auto it = mp.find(target - nums[i]);//固定一个元素,在之前的元素集合中找另一个if(it != mp.end()){
result.push_back(it->second);
result.push_back(i);}
mp.insert(pair<int,int>(nums[i], i));}return result;}};
leetcode 15 三数之和
classSolution{public:
vector<vector<int>>threeSum(vector<int>& nums){
vector<vector<int>> result;sort(nums.begin(), nums.end());int size = nums.size();if(nums.empty()|| nums.back()<0|| nums.front()>0){return{};}for(int i =0; i < size -2; i++){if(nums[i]>0){break;}if(i >0&& nums[i]== nums[i-1]){continue;}int fix = nums[i];int target =0- fix;int first = i +1;int last = size -1;while(first < last){if(nums[first]+ nums[last]== target){
result.push_back({nums[i], nums[first], nums[last]});while(first < last && nums[first]== nums[first +1]){
first++;}while(first < last && nums[last]== nums[last -1]){
last--;}
first++;
last--;}elseif(nums[first]+ nums[last]< target){
first++;}else{
last--;}}}return result;}};
classSolution{public:
vector<vector<int>>threeSum(vector<int>& nums){
vector<vector<int>> result;sort(nums.begin(), nums.end());if(nums.size()==0|| nums.front()>0|| nums.back()<0){return result;}for(int i =0; i < nums.size(); i++){int left = i +1;int right = nums.size()-1;if(i >0&& nums[i]== nums[i-1]){continue;}while(left < right){if(nums[i]+ nums[left]+ nums[right]>0){
right--;}elseif(nums[i]+ nums[left]+ nums[right]<0){
left++;}else{
result.push_back(vector<int>{nums[i], nums[left], nums[right]});while(left < right && nums[left]== nums[left+1])// 去重逻辑应该放在找到一个三元组之后{
left++;}while(left < right && nums[right]== nums[right-1]){
right--;}
left++;// 找到答案时,双指针同时收缩
right--;}}}return result;}};
leetcode 18 四数之和
classSolution{public:
vector<vector<int>>fourSum(vector<int>& nums,int target){
vector<vector<int>> result;sort(nums.begin(), nums.end());for(int i =0; i < nums.size(); i++){if(i >0&& nums[i]== nums[i-1]){continue;}for(int k = i +1; k < nums.size(); k++){if(k > i +1&& nums[k]== nums[k-1]){continue;}int left = k +1;int right = nums.size()-1;while(left < right){//if(nums[i] + nums[k] + nums[left] + nums[right] > target) 会溢出if(nums[i]+ nums[k]> target -(nums[left]+ nums[right])){
right--;}elseif(nums[i]+ nums[k]< target -(nums[left]+ nums[right])){
left++;}else{
result.push_back(vector<int>{nums[i], nums[k], nums[left], nums[right]});while(left < right && nums[left]== nums[left+1])// 去重逻辑应该放在找到一个三元组之后{
left++;}while(left < right && nums[right]== nums[right-1]){
right--;}
left++;// 找到答案时,双指针同时收缩
right--;}}}}return result;}};
leetcode 454 四数相加II
classSolution{public:intfourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4){
unordered_map<int,int> umap;// key --> a+b value --> a+b出现的次数 for(auto a : nums1){for(auto b : nums2){
umap[a+b]++;}}int count =0;//计算a+b+c+d出现的次数for(auto c : nums3){for(auto d : nums4){if(umap.find(0-(c+d))!= umap.end()){
count += umap[0-(c+d)];}}}return count;}};