● 454.四数相加II
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int,int> umap;//创建一个无序的哈希映射,用于存储值及其出现的次数
for(int a:nums1){
for(int b:nums2){
umap[a+b]++;//将键值对写入unordered_map中,如果该键已经存在,就加一,如果不存在,创建
}
}
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. 赎金信
赎金信只需要利用数组进行计算即可,只有小写字母,所以只需要将其中的字母变为0-25的数值,仅存储出现的次数即可。
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int record[26]={0};
if(ransomNote.size()>magazine.size()){
return false;
}
for(int i=0;i<magazine.length();i++){
record[magazine[i]-'a']++;
}
for(int j=0;j<ransomNote.length();j++){
record[ransomNote[j]-'a']--;
if(record[ransomNote[j]-'a']<0){
return false;
}
}
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[left],nums[right]});
while(right>left&&nums[right]==nums[right-1]) right--;
while(right>left&&nums[left]==nums[left+1]) left++;//left是向后移,因此要判断的是后一位
//不遍历while,那么直接改变指针
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[k]+nums[i]+nums[left]+nums[right]>target){
right--;
}
else if((long)nums[k]+nums[i]+nums[left]+nums[right]<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;
}
};
● 总结
文章介绍了四个编程题目,涉及数组计算、哈希映射、排序等技术,解决三数之和和四数之和问题,以及字母到数值的转换在字符串处理中的应用。
220





