继续打卡day6

383. 赎金信 - 力扣(LeetCode)

cpp 复制代码
class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        unordered_map<char, int> us;
        for(auto c: ransomNote){
            us[c]++; // 将字符串存储
        }
        for(auto c: magazine){
            if(us.count(c)){
                us[c]--;
                if(us[c] == 0) us.erase(c);
            }
        }
        return us. Empty();
    }
};

15. 三数之和 - 力扣(LeetCode)

还是不会处理这里的去重逻辑

cpp 复制代码
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        vector<vector<int>> ans;
        auto n = nums.size();
        for(auto i = 0; i < n - 2; i++){  // 边界注意是n-2
            int left = i + 1, right = n -1;
            if(i > 0 && nums[i-1] == nums[i]) continue;
            while(left < right){
                int target = nums[i] + nums[left] + nums[right];
                if(target > 0){
                    right--;
                }else if(target < 0){
                    left++;
                } else{
                    vector<int> res = {nums[i], nums[left], nums[right]};
                    ans.push_back(res);
                    while(left < right && nums[left] == nums[left+1]) left++;
                    while(right > left && nums[right-1] == nums[right]) right--;
                    left++;
                    right--;
                }
            }
        }
        return ans;
    }
};

454. 四数相加 II - 力扣(LeetCode)

cpp 复制代码
class Solution {
public:
    int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
        unordered_map<int, int> ump;
        for(auto a: nums1){
            for(auto b: nums2){
                ump[a+b]++; // 统计可能出现的组数 , 次数
            }
        }
        int ans = 0;
        for(auto c : nums3){
            for(auto d : nums4){
                if(ump.count(-(c+d))){
                    ans += ump[-c -d];
                }
            }
        }
        return ans;
    }
};

18. 四数之和 - 力扣(LeetCode)

cpp 复制代码
class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> res;
        int n = nums.size();
        if(n < 4) return res;
        sort(nums.begin(), nums.end());
        for(int i = 0; i < n - 3; i++){
            if(i > 0 && nums[i] == nums[i-1]) continue;
            for(int j = i+1; j < n - 2; j++){
                if(j > i + 1 && nums[j-1] == nums[j]) continue;
                long long sum2 = nums[i] + nums[j];
                // 双指针
                int left = j + 1, right = n - 1;
                while(left < right){
                    long long sum4 = sum2 + nums[left] + nums[right];
                    if(target > sum4){
                        left++;
                    }else if(target < sum4){
                        right--;
                    } else{ // 找到一个4元组合
                        res.push_back({nums[i], nums[j], nums[left],nums[right]});
                        while(left < right && nums[right-1] == nums[right]) right--;
                        while(left < right&& nums[left+1] == nums[left]) left++;
                        left++, right--;
                    }
                }
            }
        }
        return res;
    }
};

总结:这次有的题目第二次写了还是不会,归根结底是对原理不清楚,只是在背题解一样,要多理解为什么这样写的原理。最难不过坚持!!!