lc454四数相加II
文章&视频:lc454
代码:
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int, int> umap;
int count = 0;
for (int a : nums1) {
for (int b : nums2) {
umap[a+b]++;
}
}
for (int c : nums3) {
for (int d : nums4) {
if (umap.find(0-c-d) != umap.end()) {
count += umap[0-c-d];
}
}
}
return count;
}
};
C++语法积累:
// 访问map中对应健的值
// 1. 用房括号
// ...
umap[key] = 5;
cout << umap[key] << endl;
// 5
// 2. 用 .at()成员函数
cout << umap.at(key) << endl;
// 5
lc383赎金信
文章&视频:lc383
代码:
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int count[26] = {0};
bool flag = true;
for (char s : magazine) {
count[s - 'a']++;
}
for (char r : ransomNote) {
count[r - 'a']--;
if (count[r - 'a'] < 0) {
flag = false;
}
}
return flag;
}
};
lc15三数之和
文章&视频:lc15
代码:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> results;
int i = 0;
// 对i进行遍历
for ( ; i <= nums.size()-3; i++) {
int left = i + 1, right = nums.size() - 1;
// 对nums数组进行排序
std::sort(nums.begin(), nums.end());
// 去重
if (i > 0 && nums[i] == nums[i-1]) continue;
while (left < right) {
// int left = i+1, right = nums.size()-1;
if (nums[i] + nums[left] + nums[right] > 0) {
right--;
}
else if (nums[i] + nums[left] + nums[right] < 0) {
left++;
}
else {
vector<int> result = {nums[i], nums[left], nums[right]};
results.push_back(result);
// 去重
while (left < right && nums[left+1] == nums[left]) left++;
while (left < right && nums[right-1]== nums[right])right--;
// 找到答案时,双指针同时收缩
left++;
right--;
}
}
}
return results;
}
};
lc18四数之和
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
std::sort(nums.begin(), nums.end());
vector<vector<int>> results;
int k = 0;
for ( ; k <= nums.size()-4; k++) {
// 剪枝
if (target > 0 && nums[k] > target) break;
// 去重
if (k > 0 && nums[k-1] == nums[k]) continue;
int i = k + 1;
for ( ; i <= nums.size()-3; i++) {
// 二级剪枝
if (target > 0 && ((long)nums[k] + nums[i]) > target) break;
// 二级去重 这里需要去重,但是要搞清楚i的下标
if (i > k + 1 && nums[i-1] == nums[i]) continue;
int left = i + 1;
int right = nums.size()-1;
while (left < right) {
// (nums[k] + nums[i] + nums[left] + nums[right])会溢出
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 {
results.push_back(vector<int>{nums[k], nums[i], nums[left], nums[right]});
while (left < right && nums[left+1] == nums[left]) left++;
while (left < right && nums[right-1] == nums[right])right--;
// 找到一个结果后left, right指针向中间移动
left++;
right--;
}
}
}
}
return results;
}
};
代码有问题,明天再看看