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

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

时间:2023-01-18 22:00:29浏览次数:46  
标签:vector 四数 15 nums int 随想录 right result left

关键内容:

454.本题的思路在于分组,因为是几个不同数组的元素相加,所以将一部分数组分为一组,剩下的一组,第一组放入map,与第二组比较,进行后续操作;因此,本题为4个数组,实则3个之类的也可。同时注意map的key与val是什么,此题key是元素值,val是出现的次数(方便日后count的计算)

class Solution {
public:
    int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
        unordered_map<int,int> exm;
        for (int a : nums1)
        {
            for (int b : nums2)
            {
                exm[a+b]++;     //首先要清楚key和val分别是什么,这里val是次数,初始化0
            }
        }
        int count=0;
        for (int c:nums3)
        {
            for (int d: nums4)
            {
                if (exm.find(0-c-d)!=exm.end())
                {
                    count+=exm[0-c-d];        //注意不要写成count+=1。次数未必只有1;
                }
            }
        }
        return count;
    }
}

383.此题快速判断得出需要用哈希表做,可用数组或是map,而map维护成本高,数据更大时比数组慢得多。

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

15.三数之和,本题用哈希表(set)或是用双指针都可以做,但哈希表细节处理繁琐的多(主要由于三元组不可以重复,去重操作繁琐),所以用双指针更佳,而最需要注意的问题便是三个点的去重方式和时机

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        vector<vector<int>> result;
        int left;
        int right;
        if(nums[0]==0 && nums[1]==0 && nums[2]==0)
        {
            result.push_back(vector<int>{0,0,0});
            return result;
        }
        for (int i=0;i<nums.size();i++)
        {
            /*if(nums[i]==nums[i+1])    //第一点去重,这是开始时错误的方式,若三元组同时包含nums【i】,【i+1】,便会错过。
            {
                continue;
            }*/
            if(i>0 && nums[i]==nums[i-1])   //这样可以
            {
                continue;
            }
            left=i+1;
            right=nums.size()-1;
            while(left<right )
            {
               /* if (nums[left]==nums[left+1]) //第二,第三点开始的错误去重方式,这样主要的错因在于若合适的right与left相等且相邻,就会错过,所以要先存储,再去重
                {
                    left+=1;
                    continue;
                }
                if (nums[right]==nums[right-1])
                {
                    right-=1;
                    continue;
                }*/
                if(nums[i]+nums[left]+nums[right]==0)
                {
                    vector<int> p;
                    p.push_back(nums[i]);
                    p.push_back(nums[left]);
                    p.push_back(nums[right]);
                    //if(result.find(p)==result.end())
                    result.push_back(p);
                   while(right>left && nums[right]==nums[right-1])
                    {
                        right--;
                    }
                    while(right>left && nums[left]==nums[left+1])
                    {
                        left++;
                    }
                    left+=1;
                    right-=1;
                    continue;
                }
                if(nums[i]+nums[left]+nums[right]<0)
                {
                    left+=1;
                    continue;
                }
                if(nums[i]+nums[left]+nums[right]>0)
                {
                    right-=1;
                    continue;
                }
            }
        }
        return result;
    }
};

总结:
要熟练哈希表的使用情况和操作;
去重要考虑清楚,往往需要借助几个特殊的例子。

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

相关文章

  • 代码随想录-哈希表
    哈希表哈希表--有效的字母异位词题目:力扣题目链接给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。示例1:输入:s="anagram",t="nagaram"......
  • 代码随想录算法训练营第八天 | 反转字符串、反转字符串II,剑指Offer 05.替换空格,左旋
    344.反转字符串classSolution{public:voidreverseString(vector<char>&s){intleft=0;intright=s.size()-1;while(left<right){swap(s[left],s[rig......
  • 代码随想录算法训练营第22天
    今日刷题3道:235.二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作, 450.删除二叉搜索树中的节点● 235.二叉搜索树的最近公共祖先题目链接/文章讲解:https:......
  • daily study 15
    初识指针2;野指针:指针指向的位置是不可知的1.int*p;*P=20;指针未初始化;2.intarr[10]={0};int*p=arr;inti=0;for(i=0;i<=10;i++){*p=i;p++;}越界访问;3.指针指向了空间释放in......
  • UVA11538 Chess Queen
    简要题意给你一个\(n\timesm\)的棋盘,你需要在棋盘上放置两个颜色不同的皇后,使得它们互相攻击。求方案数。\(1\leqn,m\leq10^6\)思路下面假设\(n\leqm\)。首......
  • 15个python小例子助你快速回忆python
    #-*-coding:utf-8-*-"""====================================@FileName:20个小知识.py@Time:2023/1/1717:59@ProgramIDE:PyCharm@CreatebyAuthor:一一......
  • Servlet15 - 实现模糊查询
    模糊查询在首页添加支持模糊查询的输入框模糊查询的表单提交请求使用的是post方法,因为需要传给服务器查询关键字查询结果跳转页面还是首页,只需要在IndexServlet中重......
  • ts15属性的封装
    (function(){//定义一个表示人的类classPerson{/*可以在属性前面添加属性的修饰符public:public修饰的属性可以在任意部分访......
  • 力扣---1561. 你可以获得的最大硬币数目
    有3n堆数目不一的硬币,你和你的朋友们打算按以下方式分硬币:   每一轮中,你将会选出任意3堆硬币(不一定连续)。   Alice将会取走硬币数量最多的那一堆。   你......
  • 代码随想录算法训练营第七天 | 454.四数相加II ,383. 赎金信 ,15. 三数之和,18. 四数之和
    一、参考资料四数相加II题目链接/文章讲解/视频讲解:https://programmercarl.com/0454.%E5%9B%9B%E6%95%B0%E7%9B%B8%E5%8A%A0II.html赎金信题目链接/文章讲解:https:......