LeetCode454.四数相加
分成两组相加,用map查找key出现的次数
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int, int> s1_Plus_s2;
int result = 0;
for(int i = 0; i < nums1.size(); i++){
for(int j = 0; j < nums2.size(); j++){
int key = nums1[i] + nums2[j];
s1_Plus_s2[key]++;
}
}
for(int i = 0; i < nums3.size(); i++){
for(int j = 0; j < nums4.size(); j++){
int key = -nums3[i] - nums4[j];
if(s1_Plus_s2.find(key)!=s1_Plus_s2.end()){
result += s1_Plus_s2[key];
}
}
}
return result;
}
};
LeetCode383.赎金信
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
unordered_map<int, int> ransomtable, magatable;
for(int i = 0; i < magazine.length(); i++){
magatable[magazine[i]]++;
}
for(int i = 0; i < ransomNote.length(); i++){
ransomtable[ransomNote[i]]++;
if(magatable[ransomNote[i]] < ransomtable[ransomNote[i]]){
return false;
}
}
return true;
}
};
LeetCode15.三数相加
本题的难度在于去重,一开始没有注意到这部分,应该用一个do while循环在相加为0的情况,然后下一个原点的数值不能等于前一个原点。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> result;
if(nums.size() < 3)return result;
int cur = 0, left = 1, right = nums.size() - 1;
sort(nums.begin(),nums.end());
for(cur = 0; cur < nums.size() - 2; cur++){
if(cur != 0 && nums[cur] == nums[cur - 1])
continue;
left = cur + 1;
right = nums.size() - 1;
while(right > left){
if(nums[cur] + nums[right] + nums[left] < 0){
left++;
}else if(nums[cur] + nums[right] + nums[left] == 0){
result.push_back({nums[cur], nums[left], nums[right]});
int left_temp = nums[left], right_temp = nums[right];
do{
left++;
right--;
}while(right > left&&nums[left]==left_temp&&nums[right]== right_temp);
}else{
right--;
}
}
}
return result;
}
};
LeetCode18.四数相加
在三数相加的基础上再加一层for循环
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> result;
if(nums.size() < 4)
return result;
int cur1 = 0, cur2 = 1;
sort(nums.begin(), nums.end());
for(cur1 = 0; cur1 < nums.size() - 3; cur1++){
if(cur1 != 0 && nums[cur1 - 1] == nums[cur1]){
continue;
}
for(cur2 = cur1 + 1; cur2 < nums.size() - 2; cur2++){
if(cur2 != cur1 + 1 && nums[cur2] == nums[cur2 - 1]){
continue;
}
int left = cur2 + 1, right = nums.size() - 1;
while(right > left){
if((long long int)nums[cur1] + (long long int)nums[cur2] + (long long int)nums[left] + (long long int)nums[right] > target){
right--;
}
else if((long long int)nums[cur1] + (long long int)nums[cur2] + (long long int)nums[left] + (long long int)nums[right] == target){
result.push_back({nums[cur1], nums[cur2], nums[left], nums[right]});
int last_left = nums[left], last_right = nums[right];
do{
left++;
right--;
}while(right > left && last_left == nums[left] && last_right == nums[right]);
}
else if((long long int)nums[cur1] + (long long int)nums[cur2] + (long long int)nums[left] + (long long int)nums[right] < target){
left++;
}
}
}
}
return result;
}
};