代码随想录跟刷Day7(哈希表)


LeetCode454.四数相加

分成两组相加,用map查找key出现的次数

class Solution {
public:
    int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
        unordered_map<int, int> s1_Plus_s2;
        int result = 0;
        for(int i = 0; i < nums1.size(); i++){
            for(int j = 0; j < nums2.size(); j++){
                int key = nums1[i] + nums2[j];
                s1_Plus_s2[key]++;
            }
        }
        for(int i = 0; i < nums3.size(); i++){
            for(int j = 0; j < nums4.size(); j++){
                int key = -nums3[i] - nums4[j];
                if(s1_Plus_s2.find(key)!=s1_Plus_s2.end()){
                    result += s1_Plus_s2[key];
                }
            }
        }
        return result;
    }
};

LeetCode383.赎金信

class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        unordered_map<int, int> ransomtable, magatable;
        for(int i = 0; i < magazine.length(); i++){
            magatable[magazine[i]]++;
        }
        for(int i = 0; i < ransomNote.length(); i++){
            ransomtable[ransomNote[i]]++;
            if(magatable[ransomNote[i]] < ransomtable[ransomNote[i]]){
                return false;
            }
        }
        return true;
    }
};

LeetCode15.三数相加

本题的难度在于去重,一开始没有注意到这部分,应该用一个do while循环在相加为0的情况,然后下一个原点的数值不能等于前一个原点。

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> result;
        if(nums.size() < 3)return result;
        int cur = 0, left = 1, right = nums.size() - 1;
        sort(nums.begin(),nums.end());
        for(cur = 0; cur < nums.size() - 2; cur++){
            if(cur != 0 && nums[cur] == nums[cur - 1])
                continue;
            left = cur + 1;
            right = nums.size() - 1;
            while(right > left){
                if(nums[cur] + nums[right] + nums[left] < 0){
                    left++;
                }else if(nums[cur] + nums[right] + nums[left] == 0){
                    result.push_back({nums[cur], nums[left], nums[right]});
                    int left_temp = nums[left], right_temp = nums[right];
                    do{
                        left++;
                        right--;
                    }while(right > left&&nums[left]==left_temp&&nums[right]== right_temp);
                    
                }else{
                    right--;
                }
            }
        }
        return result;
    }
};

LeetCode18.四数相加

在三数相加的基础上再加一层for循环

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> result;
        if(nums.size() < 4)
            return result;
        int cur1 = 0, cur2 = 1;
        sort(nums.begin(), nums.end());
        for(cur1 = 0; cur1 < nums.size() - 3; cur1++){
            if(cur1 != 0 && nums[cur1 - 1] == nums[cur1]){
                continue;
            }
            for(cur2 = cur1 + 1; cur2 < nums.size() - 2; cur2++){
                if(cur2 != cur1 + 1 && nums[cur2] == nums[cur2 - 1]){
                    continue;
                }
                int left = cur2 + 1, right = nums.size() - 1;
                while(right > left){
                    if((long long int)nums[cur1] + (long long int)nums[cur2] + (long long int)nums[left] + (long long int)nums[right] > target){
                        right--;
                    }
                    else if((long long int)nums[cur1] + (long long int)nums[cur2] + (long long int)nums[left] + (long long int)nums[right] == target){
                        result.push_back({nums[cur1], nums[cur2], nums[left], nums[right]});
                        int last_left = nums[left], last_right = nums[right];
                        do{
                            left++;
                            right--;
                        }while(right > left && last_left == nums[left] && last_right == nums[right]);
                    }
                    else if((long long int)nums[cur1] + (long long int)nums[cur2] + (long long int)nums[left] + (long long int)nums[right] < target){
                        left++;
                    }
                }
            }
        }
        return result;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值