首页 > 其他分享 >代码随想录day7 LeetCode 454. 四数相加 II 383. 赎金信 15.三数之和 18四数之和

代码随想录day7 LeetCode 454. 四数相加 II 383. 赎金信 15.三数之和 18四数之和

时间:2023-01-04 12:11:57浏览次数:45  
标签:四数 15 nums int 随想录 vector right left

454. 四数相加 II

https://leetcode.cn/problems/4sum-ii/

采用哈希表法,能比暴力法减少时间复杂度,先用两个数之和做出哈希表,再用剩下两数之和寻找哈希表中的数

class Solution {
public:
    int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
        unordered_map<int,int>hash;
        for(int i=0;i<nums1.size();i++){
            for(int j=0;j<nums2.size();j++){
                int sum=nums1[i]+nums2[j];
                 if(hash.find(sum)!=hash.end())hash[sum]++;
                else hash[sum]=1;
            }
        }
        int count=0;
        for(int i=0;i<nums3.size();i++){
            for(int j=0;j<nums4.size();j++){
                if(hash.find(-1*(nums3[i]+nums4[j]))!=hash.end()){
                    count+=hash.find(-1*(nums3[i]+nums4[j]))->second;
                }
            }
        }
        return count;
    }
};

383.赎金信

https://leetcode.cn/problems/ransom-note/

双指针的拓展

class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
            int hash[26]={0};
            for(int i=0;i<magazine.size();i++){
                hash[magazine[i]-'a']++;
            }
            for(int i=0;i<ransomNote.size();i++){
                hash[ransomNote[i]-'a']--;
            }
            for(int i=0;i<26;i++){
                if(hash[i]<0)return 0;
            }
            return 1;
    }
};

15.三数之和

https://leetcode.cn/problems/3sum/

双指针的变形“三指针法”

此题注意去重的细节,三个数都需要去重否则将考虑不全面,如(0,0,0,0)等等

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

        vector<vector<int>>v1;

        int j=0;
        for(int i=0;i<nums.size();i++){
            if(nums[i]>0)return v1;
            if(i>0&&nums[i]==nums[i-1])continue;
            int left=i+1;
            int right=nums.size()-1;
            while(left<right) {

                if (nums[i] + nums[left] + nums[right] > 0)right--;
                else if (nums[i] + nums[left] + nums[right] < 0)left++;
                else {
                    v.push_back(nums[i]),v.push_back(nums[left]),v.push_back(nums[right]),v1.push_back(v),v.clear();
                    //把无效移动给剔除
                    while(left<right&&nums[right]==nums[right-1])right--;
                    while(left<right&&nums[left]==nums[left+1])left++;
                    left++;
                    right--;
                }
            }
        }
        return v1;
    }
};

 4.四数之和

https://leetcode.cn/problems/4sum/

三数之和的拓展,运用”四指针法”,再设一指针k,同时注意四个去重

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] >= 0 && nums[k] > target) {
                break;
            }
            if(k>0&&nums[k]==nums[k-1])continue;//注意不能用while
            for(int i=k+1;i<nums.size();i++){
                if((nums[i]+nums[k])>=0&&nums[i]+nums[k]>target)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[left]+nums[right]+nums[k]+nums[i]<target)left++;
                    else if((long)nums[left]+nums[right]+nums[k]+nums[i]>target)right--;//注意数据会溢出
                    else {
                        result.push_back(vector<int>{nums[k],nums[i],nums[left],nums[right]});
                        while(left<right&&nums[left]==nums[left+1]){
                            left++;
                        }
                        while(left<right&&nums[right]==nums[right-1]){
                           right--;
                        }
                        left++;
                        right--;
                    }
                }
            }
        }
        return result;
    }
};

 

标签:四数,15,nums,int,随想录,vector,right,left
From: https://www.cnblogs.com/zhishikele/p/17023795.html

相关文章

  • 【栈】LeetCode 155. 最小栈
    题目链接155.最小栈思路让栈中的每个结点都额外存储自己入栈时的栈中最小值。这样无论何时,永远能从栈顶元素取出当前栈中的最小值。代码classMinStack{//key......
  • MySQL的优化多种方法(至少15条)
    转自:https://www.cnblogs.com/tdskee/p/16536166.htmlMYSQL的优化,是每一个程序员在做数据查询处理的时候,经常有的步骤那么SQL的优化有很多种,它可以是在硬件方面的,可以是在......
  • Apache HTTPD 换行解析漏洞(CVE-2017-15715)
    1.漏洞原理ApacheHTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,a.php\x0a将被按照PHP后缀进行解析,导致绕过......
  • The 15th Jilin Provincial Collegiate Programming Contest(补题)
    The15thJilinProvincialCollegiateProgrammingContest(补题)这次只做了4个题,感觉自己还有很多不足,加油ヾ(◍°∇°◍)ノ゙这次发现好多题都需要cin加速器,好多题不加这......
  • 算法刷题 Day 7 | 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和
    从今天开始,下定决心正式把语言转为C++,之后也会用C++重新把前几天的题解再写一遍。加油454.四数相加II建议:本题是使用map巧妙解决的问题,好好体会一下哈希法如何提......
  • 15.多路查找树
    二叉树的问题:2-3树的基本介绍  2-3树是最简单的B树结构,具有以下的特点    1.2-3树的所有叶子节点都在同一层(只要是B树都满足这个条件)    2.有两个子......
  • 代码随想录算法训练营第7天
    今日刷题4道:454.四数相加II383.赎金信15.三数之和,18.四数之和。● 454.四数相加II题目链接/文章讲解/视频讲解:https://programmercarl.com/0454.%E5%9B%9B%E6......
  • [答题赛(第15轮)第一个全对者发红包
    单选题。在公众号留言回答。第一个全答对着获得奖金红包。本消息发布24小时后公布答案和得奖者。1、一台电脑可能是一台台式电脑,也可能不是;一台电脑可能是一台笔记本电脑,也......
  • 建模答题赛第2赛季第15轮-论文《UML有助防治新冠肺炎》
    在公众号留言回答。本轮1分。24小时后公布获奖者。答对个数最多者获得奖金红包,同样答对个数则答题时间早者优先。1、[单选]如果在新冠肺炎疫情期间出来一篇论文《UML有助防......
  • osgQt使用(osgQOpenGL版本)OSG3.6.5 VS2019 Qt5.15.2 CMAKE3.24
     Qt5.15.2新建QWidget工程QT新建的去qmake工程的.pro文件设置QT+=coreguigreaterThan(QT_MAJOR_VERSION,4):QT+=widgetsCONFIG+=c++17#Youcan......