【哈希表part02】| 454.四数相加、383.赎金信、15.三数之和、18.四数之和

news2025/1/12 6:15:54

目录

✿LeetCode454.四数相加❀

✿LeetCode383.赎金信❀

 ✿LeetCode15.三数之和❀

✿LeetCode18.四数之和❀


✿LeetCode454.四数相加❀

链接:454.四数相加

给你四个整数数组 nums1nums2nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:

  • 0 <= i, j, k, l < n
  • nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

刚看到这道题我的思路是计算前3个数组的和,然后再看最后一个数组中有没有加起来等于0的数字,但是最后一个数组里有重复的元素的时候,只会加一次,这样就错了,然后我看了题解,答案是写计算前两个数组之和并放入map中,其中key是相加的和,value是这个和出现的次数,然后再计算后两个数组相加,如果有四个数组相加等于0的时候,count加上出现的次数。代码如下:

public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        int count=0;
        // key存放两数之和,value存放出现次数
        Map<Integer,Integer> map=new HashMap<>();
        // 先计算前两个数组之和
        for(int i:nums1){
            for(int j:nums2){
                map.put(i+j,map.getOrDefault(i+j,0)+1);
            }
        }
        // 再计算后两个数组之和
        for(int i:nums3){
            for(int j:nums4){
                if(map.containsKey(0-i-j)){
                    count+=map.get(0-i-j);
                }
            }
        }
        return count;
    }

测试用例:

  1. 输入4个存在相加等于0的数组
  2. 输入4个不存在相加等于0的数组
  3. 输入的4个数组中有空数组
  4. 输入的4个数组全是空数组

✿LeetCode383.赎金信❀

链接:383.赎金信

给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。

如果可以,返回 true ;否则返回 false 。

magazine 中的每个字符只能在 ransomNote 中使用一次。

 

 这道题和有效字母的异位词很像,不过有效字母的异位词两个字符串的长度相等,此题是判断 ransomNote 能不能由 magazine 里面的字符构成, magazine的长度可以大于ransomNote,代码如下:

public boolean canConstruct(String ransomNote, String magazine) {
        // 1 <= ransomNote.length, magazine.length <= 105
        Map<Character,Integer> map=new HashMap<>();
        for(int i=0;i<magazine.length();i++){
            map.put(magazine.charAt(i),map.getOrDefault(magazine.charAt(i),0)+1);
        }
        for(int i=0;i<ransomNote.length();i++){
            if(map.containsKey(ransomNote.charAt(i)) && map.get(ransomNote.charAt(i))>0){
                map.put(ransomNote.charAt(i),map.get(ransomNote.charAt(i))-1);
            }else{
                return false;
            }
        }
        return true;
    }

测试用例:

  1.   ransomNote 可以由 magazine 里面的字符构成
  2.  ransomNote 不可以由 magazine 里面的字符构成
  3. ransomNote 为空
  4. magazine 为空

 ✿LeetCode15.三数之和❀

链接:15.三数之和

 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

 

这道题咋一看是不和上面的四数相加有点像,但是这道题给了一个数组,但是四数相加那道题是给了4个数组,相比之下,此题更难。因为此题要求不能包含重复的三元组,所以不能用哈希法,否则判断是否重复比较难操作,此题我用的是双指针,代码如下:

public List<List<Integer>> threeSum(int[] nums) {
        // 3 <= nums.length <= 3000
        List<List<Integer>> result=new ArrayList<>();
        List<Integer> path=new ArrayList<>();
        Arrays.sort(nums);
        for(int i=0;i<nums.length;i++){
            if(nums[i]>0){
                break;
            }
            if(i>0 && nums[i]==nums[i-1]){
                continue;
            }
            int left=i+1;
            int right=nums.length-1;
            while(left<right){
                int sum=nums[i]+nums[left]+nums[right];
                if(sum>0){
                    right--;
                }else if(sum<0){
                    left++;
                }else{
                    result.add(Arrays.asList(nums[i],nums[left],nums[right]));
                    while(left<right && nums[right]==nums[right-1]){
                        right--;
                    }
                    while(left<right && nums[left]==nums[left+1]){
                        left++;
                    }
                    right--;
                    left++;
                }
            }
        }
        return result;
    }

✿LeetCode18.四数之和❀

链接:18.四数之和

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

  • 0 <= a, b, c, d < n
  • abc 和 d 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

你可以按 任意顺序 返回答案 。

 

 这道题的做法和上一题三数之和是一样的,只不过要多一层for循环,代码如下: 

public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> result=new ArrayList<>();
        if(nums.length<4){
            return result;
        }
        Arrays.sort(nums);
        for(int i=0;i<nums.length;i++){
            if(i>0 && nums[i]==nums[i-1]){
                continue;
            }
            for(int j=i+1;j<nums.length;j++){
                if(j>i+1 && nums[j]==nums[j-1]){
                    continue;
                }
                int left=j+1;
                int right=nums.length-1;
                while(left<right){
                    long sum=(long)nums[i]+nums[j]+nums[left]+nums[right];
                    if(sum>target){
                        right--;
                    }else if(sum<target){
                        left++;
                    }else{
                        result.add(Arrays.asList(nums[i],nums[j],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;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/643754.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hive3安装

Mysql安装 卸载Centos7自带的mariadb rpm -qa|grep mariadb rpm -e mariadb-libs-5.5.64-1.el7.x86_64 --nodeps rpm -qa|grep mariadb 安装mysql mkdir /export/software/mysql 上传mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar 到上述文件夹下后解压 tar xvf mysql-5.7.29-1…

微服务技术简介

微服务技术简介 服务架构的演变微服务架构的常见概念微服务常见的解决方案Spring CloudSpring Cloud Alibaba微服务技术对比常用的微服务组件 微服务架构图 服务架构的演变 单体架构&#xff1a;当一个系统业务量很小的时候&#xff0c;将业务的所有功能集中在一个项目中开发&…

红帽认证常见答疑(一):有效期、考试题型、考试对年龄和身份要求、英语水平等

红帽认证有效期 红帽的每个证书都有有效期&#xff0c;期限3年。RHCE过期前可以考下午的RHCE&#xff08;EX294&#xff09;或者考一门RHCA来延期3年。证书过期后在红帽官网上无法下载证书&#xff0c;但仍然可以查询到考试记录&#xff0c;不会影响到就业求职&#xff0c;如果…

2.6 TCP与UDP的可靠性传输

目录 一、TCP可靠性传输1、重传机制1.1、超时重传1.2、快速重传1.3、SACK1.4、Duplicate SACK 2、滑动窗口3、流量控制3.1 滑动窗口与流量控制3.2窗口关闭 4、拥塞控制4.1拥塞窗口4.2 慢启动4.3 拥塞避免4.4 拥塞发生4.5 快速恢复 二、UDP可靠性传输1、主要策略2、重传机制2.1 …

基础知识学习---牛客网C++面试宝典(六)操作系统--第二节

1、本栏用来记录社招找工作过程中的内容&#xff0c;包括基础知识学习以及面试问题的记录等&#xff0c;以便于后续个人回顾学习&#xff1b; 暂时只有2023年3月份&#xff0c;第一次社招找工作的过程&#xff1b; 2、个人经历&#xff1a; 研究生期间课题是SLAM在无人机上的应…

湖南大学CS-2017期末考试解析

【特别注意】 答案来源于@wolf 是我在备考时自己做的,仅供参考,若有不同的地方欢迎讨论。 【试卷评析】 这张卷子有点老了,部分题目可能有用。如果仔细研究应该会有所收获。 【试卷与答案】 一.(6 分,每空 0.5 分) 下表中%r1,%r2 为两个四位的寄存器,请仿照第一行…

考虑3D海底环境的风电场集电系统

摘要 风能是目前国内外应用较为广泛的一种绿色可再生能源&#xff0c;近几年我国风电产业的发展十分迅速。然后&#xff0c;越来越多的风力发电系统建并网&#xff0c;风力发电产生的电能受外界因素影响较大&#xff0c;具有一定的随机性和波动性&#xff0c;给并网后的电力系统…

代码随想录算法训练营第三十五天| 860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

柠檬水找零 题目链接&#xff1a;力扣 这道题 我一开始用纯模拟的方法也能写出来&#xff0c;后来发现和卡哥给的答案差不多&#xff0c;其贪心的点在&#xff1a; 当账单是20的情况&#xff0c;优先消耗一个10和一个5因为美元10只能给账单20找零&#xff0c;而美元5可以给账…

为什么要进行基坑监测,基坑监测包括哪些内容?

首先我们来了解一下为什么要进行基坑监测&#xff1f;基坑作为基础建设的底层组成成分&#xff0c;关系着上层建筑的稳固安全&#xff0c;进行基坑监测主要是为了确保工程的安全、有效地管理工程施工&#xff0c;以下是具体的原因介绍&#xff1a; 1. 减少工程风险&#xff1a;…

服务限流算法

服务限流算法有哪些 计数器法&#xff08;固定窗口&#xff09;&#xff1a;原理就是限制每秒处理请求数不超过阈值。比如一个接口一分钟可以处理1000次请求&#xff0c;那么可以设置一个计数器&#xff0c;当有一次请求过来&#xff0c;计数器就加1&#xff0c;如果一分钟以内…

【分布式存储】聊一下分布式存储之复制机制

上一篇文章中&#xff0c;主要聊了下数据分片的主要内容&#xff0c;我们知道&#xff0c;**通过数据分片其实可以解决数据存储的高性能以及可拓展&#xff0c;但是也导致了用join和使用分布式事务进行查询和存储数据的问题&#xff0c;**属于按下葫芦浮起瓢。但是在分布式领域…

【大数据之Hive】十一、Hive-HQL查询之基本查询

基础语法 select [all | distinct] select_expr,select_expr, ...from table)name --从什么表查[where where_condition] --过滤[group by col_list] --分组查询[having col_list] --分组后过滤[order by col_list] --排序[cluster by col_list | …

基础知识学习---牛客网C++面试宝典(七)操作系统--第三节

1、本栏用来记录社招找工作过程中的内容&#xff0c;包括基础知识学习以及面试问题的记录等&#xff0c;以便于后续个人回顾学习&#xff1b; 暂时只有2023年3月份&#xff0c;第一次社招找工作的过程&#xff1b; 2、个人经历&#xff1a; 研究生期间课题是SLAM在无人机上的应…

从 数据工程 到 Prompt 工程

动动发财的小手&#xff0c;点个赞吧&#xff01; 数据工程构成了数据科学过程的很大一部分。在 CRISP-DM 中&#xff0c;这个过程阶段称为“数据准备”。它包括数据摄取、数据转换和数据质量保证等任务。在本文[1]章中&#xff0c;我们使用 ChatGPT 和 Python 解决了典型的数据…

用HTML5制作精美战机游戏

每天要被大学老师催H5作业&#x1f44f;&#x1f3fb;&#x1f44f;&#x1f3fb;&#x1f44f;&#x1f3fb; 不如看看本文&#xff0c;代码齐全&#xff0c;直接用来做参考案例&#x1f44c;&#x1f3fb; 干货满满不看后悔&#x1f44d;&#x1f44d;&#x1f44d; 代码…

用友畅捷通CRM SQL注入漏洞复现

0x01 产品简介 用友畅捷通CRM是面向小企业全力打造的简单、实用的客户关系管理应用。帮助企业用好自己的客户资源、管好商机跟进过程、引导好业务员跟单行为&#xff0c;促进团队销售能力的提升&#xff1b;通过查询和分析&#xff0c;识别企业的价值客户&#xff0c;融合电话、…

JUC笔记(二)

多线程编程核心 在前面&#xff0c;我们了解了多线程的底层运作机制&#xff0c;我们终于知道&#xff0c;原来多线程环境下存在着如此之多的问题。在JDK5之前&#xff0c;我们只能选择synchronized关键字来实现锁&#xff0c;而JDK5之后&#xff0c;由于volatile关键字得到了…

湖南大学CS-2021期末考试解析

【特别注意】 答案来源于@wolf 是我在备考时自己做的,仅供参考,若有不同的地方欢迎讨论。 【试卷评析】 有必要一做。 【试卷与答案】 1.简答题(10 分) 小明设计了一款机器,整数和浮点数都占 10 个 bit,其中整数采用补码表示,浮点数采用 IEEE 754 标准。 (1)…

matlab横向连接字符组成文件路径

f fullfile(myfolder,myfile.tif) %字符串中不包含反斜杠 f strcat(myfolder\,myfile.tif) %字符串中包含反斜杠,strcat函数直接拼接得到的结果一致

【软件测试】测试用例设计要点总结

文章目录 考试题型简答题(一) 等价类划分1.1 划分等价类1.2 设计测试用例 (二) 边界值分析2.1 列出边界值分析表2.2 设计测试用例 (三) 因果图分析3.1 确定原因和结果3.2 确定原因和结果之间的逻辑关系3.3 在因果图上使用标准的符号标明约束条件 (四) 判定表驱动4.1 将因果图转…