心情不好,题也做不出来,今天划水了
为什么哈希表专题一堆排序+双指针
因为是返回数组的数目,所以可以直接把四个数组拆成两队来计算。
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int,int>map;
for(int i:nums1) {
for(int j:nums2){
map[i+j]++;
}
}
int count=0;
for(int i:nums3) {
for(int j:nums4) {
if(map[-i-j]!=0) {
count+=map[-i-j];
}
}
}
return count;
}
};
简单题我重拳出击
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
unordered_map<char,int>map;
for(char ch: magazine) {
map[ch]++;
}
for(char ch:ransomNote) {
if(map[ch]==0) return false;
else if(map[ch]!=0) map[ch]--;
}
return true;
}
};
以前抄过题解,但还是不会。
排序+双指针
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ans;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++){
if(nums[i]>0) return ans;
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 {
ans.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++;
right--;
left++;
}
}
}
return ans;
}
};
不会做,抄的题解,跟上一题一个思路,但是由于这里是四个数组,所以再套一层循环。
排序+双指针
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> quadruplets;
if (nums.size() < 4) {
return quadruplets;
}
sort(nums.begin(), nums.end());
int length = nums.size();
for (int i = 0; i < length - 3; i++) {
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}
if ((long) nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target) {
break;
}
if ((long) nums[i] + nums[length - 3] + nums[length - 2] + nums[length - 1] < target) {
continue;
}
for (int j = i + 1; j < length - 2; j++) {
if (j > i + 1 && nums[j] == nums[j - 1]) {
continue;
}
if ((long) nums[i] + nums[j] + nums[j + 1] + nums[j + 2] > target) {
break;
}
if ((long) nums[i] + nums[j] + nums[length - 2] + nums[length - 1] < target) {
continue;
}
int left = j + 1, right = length - 1;
while (left < right) {
long sum = (long) nums[i] + nums[j] + nums[left] + nums[right];
if (sum == target) {
quadruplets.push_back({nums[i], nums[j], nums[left], nums[right]});
while (left < right && nums[left] == nums[left + 1]) {
left++;
}
left++;
while (left < right && nums[right] == nums[right - 1]) {
right--;
}
right--;
} else if (sum < target) {
left++;
} else {
right--;
}
}
}
}
return quadruplets;
}
};