-
今日学习的文章链接,或者视频链接
-
自己看到题目的第一想法
-
看完代码随想录之后的想法
454:
把四个数组两两分组
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
int result = 0;
unordered_map<int,int> map;//key:a+b的数值,value:a+b数值出现的次数
for (int a:nums1){
for (int b:nums2){
map[a+b]++;
}
}
for(int c:nums3){
for(int d:nums4){
int target = 0-c-d;
if(map.count(target)){
result+=map[target];
}
}
}
return result;
}
};
383:
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
unordered_map<int,int> map;
for (char m:magazine){
map[m]++;
}
for(char r:ransomNote){
if(map.count(r)){
map[r]--;
if(map[r]==0){
map.erase(r);
}
}
else{
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;
}
// 正确去重a方法
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}
int left = i + 1;
int right = nums.size() - 1;
while (left < right) {
if(nums[left]+nums[right]+nums[i]<0){
left++;
}else if(nums[left]+nums[right]+nums[i]>0){
right--;
}
else{
result.push_back(vector<int>{nums[i], nums[left], nums[right]});
right--;
left++;
while (left < right && nums[right] == nums[right + 1]) right--;
while (left < right && nums[left] == nums[left - 1]) 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; // 这里使用break,统一通过最后的return返回
}
// 去重
if(k>0&&nums[k]==nums[k-1]){
continue;
}
for (int i=k+1;i<nums.size();i++){
// 2级剪枝处理
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(left<right){
if((long)nums[k]+nums[i]+nums[left]+nums[right] < target){
left++;
}else if((long)nums[k]+nums[i]+nums[left]+nums[right] > target){
right--;
}else{
result.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--;
right--;
left++;
}
}
}
}
return result;
}
};
-
自己实现过程中遇到哪些困难
-
今日收获,记录一下自己的学习时长