首页 > 编程语言 >代码随想录算法训练营第七天 | 454.四数相加II 383.赎金信 15.三数和

代码随想录算法训练营第七天 | 454.四数相加II 383.赎金信 15.三数和

时间:2024-05-14 22:42:01浏览次数:29  
标签:四数 15 nums ++ 随想录 second right first left

四数相加II

题目链接 文章讲解 视频讲解

  • 时间复杂度 o(n2)
  • 空间复杂度 o(n)
class Solution {
public:
    int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
        unordered_map<int, int> two_sum;
        int total = 0;

        for (int a : nums1) {
            for(int b : nums2) {
                two_sum[a + b]++;
            }
        }
        // 在第二次遍历时不构造新的哈希表,不仅省去了空间的开销,又避免了再次比较的时间,很巧妙
        for(int c : nums3) {
            for(int d : nums4) {
                if (two_sum.count(- c - d)) {
                    total += two_sum[- c - d];
                }
            }
        }

        return total;
    }
};

赎金信

题目链接 文章讲解

class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        unordered_map<char, int> destination;
        for(char ch : ransomNote) {
            destination[ch]++;
        }
        unordered_map<char, int> source;
        for(char ch : magazine) {
            source[ch]++;
        }

        for(auto pair : destination) {
            if(source[pair.first] >= pair.second) {
                continue;
            } else {
                return false;
            }
        }
        return true;
    }
};

三数之和

题目链接 文章讲解 视频讲解

  • 时间复杂度 o(n2)
  • 空间复杂度 o(1)
    原本使用哈希表来解答,但是在去重的时候,一些判断总是出问题,越改越麻烦,

tips: 在涉及到去重问题时,要想到用双指针
任意顺序返回的话,一般可以烤炉先排序

ps:做剪枝操作的时候,应该用nums[i] == nums[i-1]来判断,而不用nums[i] == nums[i+1]来判断,否则像,[-1,-1, 2]这种情况就被跳过了(即时使用当前值,而非延时使用)

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        vector<vector<int>> ans;
        int i = 0;
        while(i < nums.size()) {
            if(nums[i] > 0) return ans;
            int left = i + 1, right = nums.size() - 1;
            if(i > 0 && nums[i] == nums[i - 1]) {
                i++;
                continue;
            }
            while(left < right) {       
                if(nums[i] + nums[left] + nums[right] == 0) {
                    ans.push_back({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;
                }
                else if (nums[i] + nums[left] + nums[right] < 0 && left < right) {
                    ++left;
                } 
                else if(left < right) {
                    --right;
                }
            }
            i++;
        }
        return ans;
    }
};

四数之和

题目链接 文章链接 视频讲解

  • 时间复杂度 o(n3)
  • 空间复杂度 o(1)

tips: 双指针法总是可以将时间复杂度降一个数量级

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> ans{};
        sort(nums.begin(), nums.end());
        for(int first = 0; first < nums.size(); ++first) {
            if(nums[first] > target && nums[first] > 0) break;
            if(first && nums[first] == nums[first - 1]) continue;
            for(int second = first + 1; second < nums.size(); ++second) {
                if((long long)nums[first] + nums[second] > target && (long long)nums[first] + nums[second] > 0) break;
                if(second > first + 1 && nums[second] == nums[second - 1]) continue;
                int left = second + 1, right = nums.size() - 1;
                while(left < right) {
                    if((long long)nums[first] + nums[second] + nums[left] + nums[right] == target) {
                        ans.push_back({nums[first], nums[second], nums[left], nums[right]});
                        while(left < right && nums[left] == nums[left + 1]) ++left;
                        while(left < right && nums[right] == nums[right - 1]) --right;
                        ++left, --right;
                    } else if((long long)nums[first] + nums[second] + nums[left] + nums[right] > target && left < right) {
                        --right;
                    } else if(left < right) {
                        ++left;
                    }
                    
                }
            }
        }
        return ans;
    }
};

标签:四数,15,nums,++,随想录,second,right,first,left
From: https://www.cnblogs.com/cscpp/p/18192422

相关文章

  • flutter开发ios15出现name = 'io.flutter.1.raster', stop reason = signal SIGABRT崩
    1.问题描述为了适应ios上架要求,我们项目升级了flutter升级到3.19.6的,但是莫名其妙出现了这个崩溃,最关键的是没有关键的崩溃日志,不管是flutter侧还是ios原生侧都看不出哪行代码引起的2.问题排查首先,通过崩溃日志的关键字'io.flutter.1.raster',其实的raster就是光栅化的意思......
  • PMS15
    1.GPIO 相关的寄存器设置典型配置程序://第一种配置方式PA=0b0110_0000;\//设置数据PAPH=0b1110_0000;\//设置上下拉PAC=0b1110_0000;\//控制输入输出//第二种配置方式PAC.4=0;......
  • [RCTF2015]EasySQL
    [RCTF2015]EasySQL打开环境,有一个注册一个登录按钮这里注册的时候有个坑,邮箱那栏你不能输入@xx.com,否则就会报错不允许的字符fuzz测试一下发现过滤了不少字符注册完成后登录首页的文字没有什么有用的信息,进入帐号发现可以修改密码如果是正常的账号,此时修改密码不会有......
  • 42天【代码随想录算法训练营34期】第九章 动态规划part04(● 01背包问题,你该了解这些!
    **416.分割等和子集**classSolution:defcanPartition(self,nums:List[int])->bool:_sum=0dp=[0]*10001fornuminnums:_sum+=numif_sum%2==1:returnfalsetarget=......
  • LeetCode 1915. Number of Wonderful Substrings
    原题链接在这里:https://leetcode.com/problems/number-of-wonderful-substrings/description/题目:A wonderful stringisastringwhere atmostone letterappearsan odd numberoftimes.Forexample, "ccjjc" and "abab" arewonderful,but "ab&......
  • 代码随想录算法训练营第六天 | 242.有效的字母异位词 、349. 两个数组的交集、 202.
    哈希表理论基础建议:大家要了解哈希表的内部实现原理,哈希函数,哈希碰撞,以及常见哈希表的区别,数组,set和map。什么时候想到用哈希法,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。这句话很重要,大家在做哈希表题目都要思考这句话。文章讲解:https://program......
  • AoPS - Chapter 15 Combinatorics
    这一章主要讲解各种组合恒等式。但是事实上,有很大一部分都能用有限微积分、OGF、EGF之类的武器轻松搞定。组合恒等式组合数定义朴素定义:\[\binomnm=\dfrac{n!}{m!(n-m)!}\]下降幂定义:\[\binomnm=\dfrac{n^{\underlinem}}{m!}\]组合数递推式(Pascal'sIdenti......
  • postgresql(14-15)升级(源库需要停机)
    环境:OS:Centos7旧版本:pg14新版本:pg15已经安装的插件mysql_fdw_14.x86_64postgis33_14.x86_64 1.查看当前的版本[root@dsc1~]#psql-hlocalhost-Upostgres-p5432psql(14.11)Type"help"forhelp.postgres=#selectversion();......
  • 代码随想录算法训练营day06 | 242.有效字母异位词
    242.有效的字母异位词题目链接文章讲解视频讲解时间复杂度o(n)空间复杂度o(n)classSolution{public:boolisAnagram(strings,stringt){unordered_map<char,int>s_map,t_map;for(charch:s)s_map[ch]++;for(charch:t)t......
  • [LeetCode] 1584.连接所有点的最小费用 Kruskal And Prim 算法 Java 并查集
    Problem:1584.连接所有点的最小费用目录Kruskal算法复杂度CodePrim算法复杂度CodeKruskal算法复杂度时间复杂度:添加时间复杂度,示例:$O(mlog(m))$空间复杂度:添加空间复杂度,示例:$O(n)$CodeclassSolution{publicintminCostConnectPoints(int[][]po......