代码随想录D7

54.四数相加II 

学习资料

题目链接/文章讲解/视频讲解:代码随想录

 代码

class Solution {
public:
    int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4){
        unordered_map<int,int> ijSum;

        for(int i : nums1){
            for(int j : nums2){
                ijSum[i + j]++;
            }
        }
        
        int count = 0;
        

        for(int k : nums3){
            for(int l : nums4){
                auto it = ijSum.find(-k - l);
                if(it != ijSum.end()){
                    count += it->second;
                }
            }
        }

        return count;
    }
};

 383. 赎金信 

学习资料

题目链接/文章讲解:代码随想录

代码

class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        unordered_map<char,int> dictionary;

        for(char c : ransomNote){
            dictionary[c]++;
        }

        for(char c : magazine){
            if(dictionary.count(c)){
                dictionary[c]--;
            }
        }

        for(auto it : dictionary){
            if(it.second > 0){
                return false;
            }
        }

        return true;
    }
};
class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        int dictionary[26];

        for(char c : magazine){
            dictionary[c- 'a']++;
        }

        for(char c : ransomNote){
            dictionary[c - 'a']--;
        }

        for(int i : dictionary){
            if(i < 0){
                return false;
            }
        }
        return true;
    }
};

 15. 三数之和 

学习资料

题目链接/文章讲解/视频讲解:代码随想录

代码

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        vector<vector<int>> ans;

        int left;
        int right;
        int target;

        for(int i = 0; i < nums.size() - 1;){
            left = i + 1;
            right = nums.size() - 1;
            target = 0 - nums[i];

            if (nums[i] > 0) {
                return ans;
            }

            while(left < right){
                if(nums[left] + nums[right] == target){
                    ans.push_back({nums[i],nums[left],nums[right]});

                    while(nums[left] == nums[left + 1] && left + 1 < right){
                        left++;
                    }
                    left++;

                    while(nums[right - 1] == nums[right] && right - 1 > left){
                        right--;
                    }
                    right--;  
                }
                else if(nums[left] + nums[right] < target){
                    while(nums[left] == nums[left + 1] && left + 1 < right){
                        left++;
                    }
                    left++;
                }
                else{
                    while(nums[right - 1] == nums[right] && right - 1 > left){
                        right--;
                    }
                    right--; 
                }
            }
            while(nums[i] == nums[i + 1] && i + 1 < nums.size() - 1){
                i++;
            }
            i++;
        }
        return ans;
    }
};

 18. 四数之和  

学习资料

题目链接/文章讲解/视频讲解:代码随想录

代码

和三数之和一样的方法,有一些int越界问题用了粗暴地改变量类型解决

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        sort(nums.begin(),nums.end());
        vector<vector<int>> ans;

        int left;
        int right;
        long last_two_sum;

        for(int i = 0; i < nums.size() - 1;){
            for(int j = i + 1; j < nums.size() - 1;){
                left = j + 1;
                right = nums.size() - 1;
                last_two_sum = (long)target - (long)nums[i] - (long)nums[j];

                

                while(left < right){
                    if((long)(nums[left] + nums[right]) == last_two_sum){
                        ans.push_back({nums[i],nums[j],nums[left],nums[right]});

                        while(nums[left] == nums[left + 1] && left + 1 < right){
                            left++;
                        }
                        left++;

                        while(nums[right - 1] == nums[right] && right - 1 > left){
                            right--;
                        }
                        right--;  
                    }
                    else if((long)(nums[left] + nums[right]) < last_two_sum){
                        while(nums[left] == nums[left + 1] && left + 1 < right){
                            left++;
                        }
                        left++;
                    }
                    else{
                        while(nums[right - 1] == nums[right] && right - 1 > left){
                            right--;
                        }
                        right--; 
                    }
                }
                while(nums[j] == nums[j + 1] && j + 1 < nums.size() - 1){
                    j++;
                }
                j++;
            }
            while(nums[i] == nums[i + 1] && i + 1 < nums.size() - 1){
                i++;
            }
            i++;
        }
        return ans;
    }
};

 增加一些剪枝优化

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        sort(nums.begin(),nums.end());
        vector<vector<int>> ans;

        int left;
        int right;
        long last_two_sum;

        for(int i = 0; i < nums.size() - 1;){
            if (nums[i] > target && nums[i] >= 0) {
            	break;
            }

            for(int j = i + 1; j < nums.size() - 1;){
                if (nums[i] + nums[j] > target && nums[i] + nums[j] >= 0) {
                    break;
                }

                left = j + 1;
                right = nums.size() - 1;
                last_two_sum = (long)target - (long)nums[i] - (long)nums[j];

                while(left < right){
                    if((long)(nums[left] + nums[right]) == last_two_sum){
                        ans.push_back({nums[i],nums[j],nums[left],nums[right]});

                        while(nums[left] == nums[left + 1] && left + 1 < right){
                            left++;
                        }
                        left++;

                        while(nums[right - 1] == nums[right] && right - 1 > left){
                            right--;
                        }
                        right--;  
                    }
                    else if((long)(nums[left] + nums[right]) < last_two_sum){
                        while(nums[left] == nums[left + 1] && left + 1 < right){
                            left++;
                        }
                        left++;
                    }
                    else{
                        while(nums[right - 1] == nums[right] && right - 1 > left){
                            right--;
                        }
                        right--; 
                    }
                }
                while(nums[j] == nums[j + 1] && j + 1 < nums.size() - 1){
                    j++;
                }
                j++;
            }
            while(nums[i] == nums[i + 1] && i + 1 < nums.size() - 1){
                i++;
            }
            i++;
        }
        return ans;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值