Leetcode 454 四数相加Ⅱ
本题没有要求去重,可以用一个unordered_map先保留A+B,再枚举nums3和nums4,查询是否有(0-C-D)。
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int, int> cur;
for(int A : nums1){
for(int B : nums2){
cur[A + B] ++;
}
}
int cnt = 0;
for(int C : nums3){
for(int D : nums4){
auto iter = cur.find(0 - C - D);
if(iter != cur.end()){
cnt = cnt + iter -> second;
}
}
}
return cnt;
}
};
Leetcode 383 赎金信
使用一个map记录magazine的字符出现次数,遍历ransomnote。官解用的数组,因为数组的实现要比map更高效。
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
unordered_map<char, int> map;
for(char s : magazine){
map[s] ++;
}
for(char s : ransomNote){
auto iter = map.find(s);
if(iter == map.end()){
return false;
}else{
iter -> second --;
if(iter -> second == 0){
map.erase(s);
}
}
}
return true;
}
};
Leetcode 15 三数之和
不管怎么样,还是要先对数组排序,然后注意题目中无重复的要求,需要特别操作。在遍历数组的前提下,使用双指针寻找(0-nums[i]),left指向i+1,right指向nums.size()-1,移动的条件为相同的值只用一次。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(), nums.end());
int n =nums.size();
vector<vector<int>> ans;
for (int i = 0; i < n; i++){
if(i > 0 && nums[i] == nums[i-1])
continue;
int k = n-1;
int target = -nums[i];
for(int j = i+1; j < n; j++){
if(j > i+1 && nums[j] == nums[j-1])
continue;
while(j < k && nums[j] + nums[k] > target){
k--;
}
if (j == k)
break;
if(nums[i] + nums[j] + nums[k] == 0)
ans.push_back({nums[i], nums[j], nums[k]});
}
}
return ans;
}
};
Leetcode 18 四数之和
和三数之和一样,只不过要再加一层循环,注意int类型数据溢出。
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
vector<vector<int>> res;
for(int a = 0; a < nums.size(); a++){
if(a > 0 && nums[a] == nums[a-1]){
continue;
}
for(int b = a + 1; b < nums.size(); b++){
if(b > a + 1 && nums[b] == nums[b - 1]){
continue;
}
int c = b + 1;
int d = nums.size() - 1;
while(c < d){
if((long) nums[a] + nums[b] + nums[c] + nums[d] < target){
c++;
}
else if((long) nums[a] + nums[b] + nums[c] + nums[d] > target){
d--;
}
else{
res.push_back(vector<int>{nums[a], nums[b], nums[c], nums[d]});
while(c < d && nums[c] == nums[c + 1]) {c++;}
while(c < d && nums[d] == nums[d - 1]) {d--;}
c++;
d--;
}
}
}
}
return res;
}
};