学习目标
继续深造hash表
过程
454.四数相加II
第一题,想了好长时间,试了一些方法,还是error,解题思路,采用map的方式。
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
//判断有多少数相加等于0;
//将 前2个相加组成一个和值,后2个相加组成一个和值
unordered_map<int ,int>map; //默认为0
int return_num=0;
for(int i=0;i<nums1.size();i++){
for(int j=0;j<nums2.size();j++){
map[nums1[i]+nums2[j]]++;
}
}
for(int i=0;i<nums3.size();i++){
for(int j=0;j<nums4.size();j++){
if(map.find(0-nums3[i]-nums4[j])!=map.end()){
return_num+=map[0-nums3[i]-nums4[j]];
}
}
}
return return_num ;
}
};
383. 赎金信
判断一个字符串是不是由另一个字符串构成。
理解错误,以为要用KMP 比较字符
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int sum[26]={0};
int size1=ransomNote.size();
int size2=magazine.size();
if(size1>size2){
return false;
}
for(int i=0;i<magazine.size();i++){
sum[magazine[i]-'a']++;
}
for(int i=0;i<ransomNote.size();i++){
if(sum[ransomNote[i]-'a']>0){
sum[ransomNote[i]-'a']--;
}
else{
return false;
}
}
return true;
}
};
15. 三数之和
采用双指针的方法,去重写的有点麻烦。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
//判断三数字之和
int size=nums.size();
vector<vector<int>> return_vector_2;
int temp1,temp2,temp3;
temp1=-99999;
sort(nums.begin(),nums.end());
for(int i=0;i<size-2;i++){
if(temp1==nums[i]){
continue;
}
temp1=nums[i];
if(temp1>0){
break;
}
int left=i+1;
int right=size-1;
int before_2=-99999;
int before_3=-99999;
while(left<right){
if(nums[left]==before_2){
left++;
continue;
}
if(nums[right]==before_3){
right--;
continue;
}
temp2=nums[left];
temp3=nums[right];
int sum=temp2+temp3+temp1;
if(sum>0){
before_3=temp3;
before_2=-99999;
right--;
}
else if(sum<0){
before_2=temp2;
before_3=-99999;
left++;
}
else{
vector<int> temp_vector;
temp_vector.push_back(temp1);
temp_vector.push_back(temp2);
temp_vector.push_back(temp3);
return_vector_2.push_back(temp_vector);
before_2=temp2;
before_3=temp3;
right--;
left++;
}
}
}
return return_vector_2;
}
};
18. 四数之和
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
//判断三数字之和
int size=nums.size();
vector<vector<int>> return_vector_2;
int temp1,temp2,temp3,temp4;
temp1=-99999;
sort(nums.begin(),nums.end());
for(int i=0;i<size-3;i++){
if(temp1==nums[i]){
continue;
}
temp1=nums[i];
if((temp1>target)&&(temp1>=0)){
break;
}
temp2=-99999;
for(int j=i+1;j<size-2;j++){
if(temp2==nums[j]){
continue;
}
temp2=nums[j];
if((((long)temp1+temp2)>target)&&(((long)temp1+temp2)>=0)){
break;
}
int left=j+1;
int right=size-1;
while(left<right){
temp3=nums[left];
temp4=nums[right];
long sum=(long)temp4+temp3+temp2+temp1;
if(sum>target){
right--;
while (right > left && temp4 == nums[right]) right--;
}
else if(sum<target){
left++;
while (right > left && temp3 == nums[left]) left++;
}
else{
vector<int> temp_vector;
temp_vector.push_back(temp1);
temp_vector.push_back(temp2);
temp_vector.push_back(temp3);
temp_vector.push_back(temp4);
return_vector_2.push_back(temp_vector);
right--;
left++;
while (right > left && temp4 == nums[right]) right--;
while (right > left && temp3 == nums[left]) left++;
}
}
}
}
return return_vector_2;
}
};
结论
过程挺艰难的,好在硬凑好了!关键只有一题和HASH有关!