457.四数相加
不需要考虑去重的操作,使用map记录下a+b的值以及次数,之后看map中a+b的值是否是0-a+b,如果是,则count加上a+b出现的次数
代码如下:
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int,int> umap; //key记录a+b的值,value记录a+b的次数
for(int a:nums1){
for(int b:nums2){
umap[a+b]++;
}
}
int count=0;
for(int c:nums3){
for(int d:nums4){
if(umap.find(0-(c+d))!=umap.end()){
count+=umap[0-(c+d)];
}
}
}
return count;
}
};
383.赎金信
暴力解法:两层循环
代码如下:
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int count=0;
for(int i=0;i<ransomNote.length();i++){
for(int j=0;j<magazine.length();j++){
if(ransomNote[i]==magazine[j]){
magazine.erase(magazine.begin()+j);
count++;
break;
}
}
}
if(count==ransomNote.length())
return true;
else
return false;
}
};
哈希法:使用数组,不使用map的原因是map相对来说比较耗时
代码如下:
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int record[26];
for(int i=0;i<magazine.length();i++){
record[magazine[i]-'a']++;
}
for(int j=0;j<ransomNote.length();j++){
if(record[ransomNote[j]-'a']!=0){
record[ransomNote[j]-'a']--;
}
else {
return false;
break;
}
}
return true;
}
};
15.三数之和
哈希法要去重比较麻烦,所以采用双指针法
使用双指针法要先对数组进行排序,思想有点类似于二分法,之后要去重!!注意是找到元素之后才去重,如果没找到元素之前就去重,会有一些值找不到。
代码如下:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>>result;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++){
if(nums[i]>0){
return result;
}
if(i>0&&nums[i]==nums[i-1])
continue;
int left=i+1;
int right=nums.size()-1;
while(right>left){
if(nums[i]+nums[left]+nums[right]>0){
right--;
}
else if(nums[i]+nums[left]+nums[right]<0){
left++;
}
else{
result.push_back(vector<int>{nums[i],nums[right],nums[left]});
while(right>left&&nums[right]==nums[right-1]) right--;
while(right>left&&nums[left]==nums[left+1]) left++;
right--;
left++;
}
}
}
return result;
}
};
18.四数之和
跟三数之和思路一样,注意去重
代码如下:
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> result;
sort(nums.begin(),nums.end());
for(int k=0;k<nums.size();k++){
if(nums[k]>target&&nums[k]>=0)
break;
if(k>0&&nums[k]==nums[k-1])
continue;
for(int i=k+1;i<nums.size();i++){
if(nums[k]+nums[i]>target&&nums[k]+nums[i]>=0)
break;
if(i>k+1&&nums[i]==nums[i-1])
continue;
int left=i+1;
int right=nums.size()-1;
while(right>left){
if((long)nums[i]+nums[k]+nums[right]+nums[left]>target)
right--;
else if((long)nums[i]+nums[k]+nums[right]+nums[left]<target)
left++;
else {
result.push_back(vector<int>{nums[k],nums[i],nums[left],nums[right]});
while(right>left&&nums[right]==nums[right-1]) right--;
while(right>left&&nums[left]==nums[left+1]) left++;
right--;
left++;
}
}
}
}
return result;
}
};
总结
有时候即使是“不能重复”也不一定适用于哈希法