代码随想录算法训练营DAY7 | 哈希表(2)

一、LeetCode 454 四数相加II

题目链接:454.四数相加IIicon-default.png?t=N7T8https://leetcode.cn/problems/4sum-ii/description/

思路:建立HashMap,Key存储nums1、nums2数对之和,Value存储数对和出现次数,再遍历nums3、nums4数对确定答案。

class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        Map<Integer,Integer> map = new HashMap<>(); //key存放a、b两数之和,value存放两数之和出现的次数
        int n = nums1.length;
        int ans = 0;
        //存储nums1、nums2各数之和
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                int sum = nums1[i] + nums2[j];
                if(map.containsKey(sum)){
                    int num = map.get(sum);
                    map.put(sum,num+1);
                }else{
                    map.put(sum,1);
                }
            }
        }
        //检验nums3和nums4中有多少符合条件的数对
        for(int i = 0; i < n ;i++){
            for(int j = 0; j < n; j++){
                int sum2 = nums3[i] + nums4[j];
                if(map.containsKey(0-sum2)){
                    ans += map.get(0-sum2);   //检测出符合条件的元组1*num
                }
            }
        }
        return ans;
    }
}

 二、LeetCode 383 赎金信

题目链接:383.赎金信icon-default.png?t=N7T8https://leetcode.cn/problems/ransom-note/description/

思路一:使用HashMap,Key存储字符,Value存储字符出现次数;分别遍历magazine与ransomNote,判断是否可行。

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        int rlen = ransomNote.length();
        int mlen = magazine.length();
        if(mlen < rlen){
            return false;
        }
        Map<Character,Integer> map = new HashMap<>(); //key存储字符,value存储magazine字符出现次数
        for(int i = 0; i < mlen; i++){
            Character temp = magazine.charAt(i);
            if(map.containsKey(temp)){
                map.put(temp,map.get(temp)+1);
            }else{
                map.put(temp,1);
            }
        }
        for(int i = 0; i < rlen; i++){
            Character temp = ransomNote.charAt(i);
            if(map.containsKey(temp)){
                int num = map.get(temp);
                if(num == 1){
                    map.remove(temp);
                }else{
                    map.put(temp,num-1);
                }
            }else{
                return false;
            }
        }
        return true;
    }
}

思路二:自建字典 alp[] = new int[26]。

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        int rlen = ransomNote.length();
        int mlen = magazine.length();
        if(rlen > mlen){
            return false;
        }
        int[] alp = new int[26];   //自建字典
        for(int i = 0; i < mlen; i++){
            alp[magazine.charAt(i) - 'a']++;
        }
        for(int i = 0; i < rlen ; i++){
            if(alp[ransomNote.charAt(i)-'a'] == 0){
                return false;
            }else{
                alp[ransomNote.charAt(i)-'a']--;
            }
        }
        return true;
    }
}

 三、LeetCode 15 三数之和

题目链接:15.三数之和icon-default.png?t=N7T8https://leetcode.cn/problems/3sum/description/

思路:先对数组进行排序,设置双指针遍历并进行去重操作,得出不重复的三元组序列。

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>> ans = new ArrayList<>();
        for(int i = 0; i < nums.length; i++){
            //排序后第一个数就大于0,不存在符合题意的答案
            if(nums[i] > 0){
                return ans;
            }
            if(i > 0 && nums[i] == nums[i-1]){
                continue;
            }
            int left = i+1;
            int right = nums.length - 1;
            while(right > left){
                if(nums[i] + nums[left] + nums[right] > 0){
                    right--;
                }else if(nums[i] + nums[left] + nums[right] < 0){
                    left++;
                }else{
                    //去重逻辑应放到添加第一个三元组之后
                    List<Integer> list = new ArrayList<>();
                    list.add(nums[i]);
                    list.add(nums[left]);
                    list.add(nums[right]);
                    ans.add(new ArrayList(list));
                    //去重
                    while(right > left && nums[right] == nums[right-1]){
                        right--;
                    }
                    while(right > left && nums[left] == nums[left+1]){
                        left++;
                    }
                    //双指针收缩
                    right--;
                    left++;
                }
            }
        }
        return ans;
    }
}

补充:此题不会,看的卡哥思路,明日复习。

四、LeetCode 18 四数之和

题目链接:18.四数之和icon-default.png?t=N7T8https://leetcode.cn/problems/4sum/submissions/499470243/

思路:与三数之和类似,排序、剪枝、双指针遍历、去重;掌握不熟练,需要多加练习。

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        //先给数组排序
        Arrays.sort(nums);
        List<List<Integer>> ans = new ArrayList<>();
        for(int i = 0; i < nums.length; i++){
            //一级剪枝处理
            if(nums[i] > target && nums[i] >= 0){     //数组已按增序排列,后边的数都大于target且大于0
                break;
            }
            //num[i]去重
            if(i > 0 && nums[i] == nums[i-1]){
                    continue;
            }
            for(int j = i+1; j < nums.length; j++){
                //二级剪枝
                if(nums[i] + nums[j] > target && nums[i] + nums[j] > 0){
                    break;
                }
                //nums[j]去重
                if(j > i+1 && nums[j] == nums[j-1]){
                    continue;
                }
                int left = j+1;
                int right = nums.length-1;
                while(left < right){
                    if(nums[i] + nums[j] + nums[left] + nums[right] > target){
                        right--;
                    }else if(nums[i] + nums[j] + nums[left] + nums[right] < target){
                        left++;
                    }else{
                        List<Integer> list = new ArrayList<>();
                        list.add(nums[i]);
                        list.add(nums[j]);
                        list.add(nums[left]);
                        list.add(nums[right]);
                        ans.add(new ArrayList(list));
                        //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 ans;
    }
}

五、今日小结

        三数之和、四数之和需要多加练习,双指针没能很好地运用呜呜呜;明天争取少睡一些^*^,加油ovo!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

动态住宅IP可以用来注册亚马逊电商吗?

注册亚马逊店铺可以用动态IP&#xff0c;只要是独立且干净的网线就没问题&#xff0c;亚马逊规则要求一个IP地址只能出现一个亚马逊店铺&#xff0c;若使用不当会导致关联账户。所以现在非常多人使用指纹浏览器搭配代理IP 固定ip可以给我们的账户带来更多的安全&#xff0c;要知…

如何使用docker快速安装Plik并实现固定公网地址远程访问

文章目录 推荐1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点…

矩阵键盘的使用

在定义局部变量时&#xff0c;一定要给该变量赋初值。在这个程序中&#xff0c;给按键按下的返回值变量 KeyNum 赋值为 20 。 矩阵键盘线行扫描法的学习链接&#xff1a;https://www.bilibili.com/video/BV1dv411z7Gd/?spm_id_from333.999.0.0&vd_sourceb91967c499b23106…

Nginx启用WebSocket支持

报错内容nginx.conf proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; 问题解决WebSocket跨域 add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Credentials true;

【算法专题】前缀和(附图解、代码)

&#x1f4d1;前言 本文主要是前缀和的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日一句&#xff1a;努力一点&…

Vulnhub-DerpNStink

一、信息收集 端口扫描 Scanning derpnstink.local (192.168.1.14) [1000 ports] Discovered open port 80/tcp on 192.168.1.14 Discovered open port 21/tcp on 192.168.1.14 Discovered open port 22/tcp on 192.168.1.14 目录扫描 二、漏洞利用 访问主页f12找到第一个f…

网工内推 | 资深网工,周末双休,厂商认证优先,14薪

01 群核科技 招聘岗位&#xff1a;资深网络运维工程师 职责描述&#xff1a; 1、负责公司IDC机房网络的规划及持续改进&#xff0c;保证网络稳定运行&#xff1b; 2、负责公司国内外传输线路建设&#xff0c;提高链路的高可用保证业务的SLA&#xff1b; 3、负责网络监控平台的…

逻辑回归与感知机详解

一逻辑回归 采用log函数作为代价函数 1 用于二分类问题 2 cost成本函数定义 3 求最小值&#xff0c;链式求导法则 4 梯度下降法 5 结构图表示 二 感知机 样本点到超平面距离法 1 线性二分类问题 2 点到直线距离 3 更新w 和b 参数 4 算法流程 5 例子

ssm跨域方案?

1、过滤器 2、xml配置 <mvc:cors><mvc:mapping path"/**" /> </mvc:cors>3、注解 CrossOrigin(origins “*”) 说明&#xff1a;三种方案&#xff0c;本质都是一样的、只是方式不一样罢了。

箱形图之美:Pyecharts库的高级参数解析与炫酷样式实践

Pyecharts绘制多种炫酷箱形图参数说明代码实战 引言 箱形图&#xff08;Box Plot&#xff09;&#xff0c;又称为盒须图&#xff0c;是一种用于显示一组数据分布情况的统计图表。Pyecharts是一个基于Echarts的Python库&#xff0c;可以轻松地绘制各种交互式图表&#xff0c;包…

面试相关|常见试题 or 易错题集合

&#x1f4eb; 作者简介&#xff1a;「六月暴雪飞梨花」&#xff0c;专注于研究Java&#xff0c;就职于科技型公司后端工程师 &#x1f3c6; 近期荣誉&#xff1a;华为云云享专家、阿里云专家博主、腾讯云优秀创作者 &#x1f525; 三连支持&#xff1a;欢迎 ❤️关注、&#x…

问卷发放实战指南:提高问卷回收率与数据质量的技巧

进行问卷调查分为四步&#xff1a;制作问卷、发放问卷、收集问卷、分析问卷。其中&#xff0c;发放问卷起到了关键性的作用。他关乎到我们后续收集问卷是否顺利&#xff0c;收集到的问卷数据是否具备真实性和有效性。那么&#xff0c;怎么有效地进行问卷发放呢&#xff1f; ​…

STM32通用定时器、计数器

时间记录&#xff1a;2024/1/30 一、时钟介绍&#xff08;TIM2-TIM5&#xff09; &#xff08;1&#xff09;通用定时器时钟频率介绍 内部时钟AHB为72MHz&#xff0c;经过APB1预分频器2分频变为36MHz&#xff0c;TIMxClk定时器时钟由时钟树可以看出&#xff0c;如果APB1预分…

实现SERVLET生命周期事件

实现SERVLET生命周期事件 问题陈述 David Wong是Smart Software Developers的管理员,他希望创建一个应用程序在日志中记录请求和上下文对象初始化及向上下文对象添加属性的时间。同时,该应用程序应该还能在日志中记录删除上下文对象的属性及销毁请求和上下文时的时间。 解决方…

Python 因果推断(上)

引言 原文&#xff1a;causal-methods.github.io/Book/Introduction.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 作者&#xff1a;Vitor Kamada 电子邮件&#xff1a;econometrics.methodsgmail.com 最后更新日期&#xff1a;2020 年 8 月 15 日 这本书是使…

live2D学习:做好让图片动起来的准备

做好让图片动起来的准备https://www.bilibili.com/video/BV1JE411Y7Te?p2&vd_source124076d7d88eee393a1d8bf6fc787efa 把psd文件通过菜单栏的“打开文件”进行导入或直接把psd文件拖到Live2D Cubism Editor 4.0的面板中 网格 我们在点击图像的一部分时&#xff0c;会出现…

vmware安装ubuntu server22.04

下载ubuntu https://cn.ubuntu.com/download 安装vmware 安装 选择自定义硬件&#xff0c;删除打印机和声卡 选择ubuntu镜像 关闭&#xff0c;完成 开启虚拟机 空格选择minimized 重启输入账号密码登录 查看Ip地址使用xshell链接 我看时区不对想修改…

MKRZero通过I2S读取SPH0645音频数据

文章目录 简介实验准备接线定义示例程序实验现象总结 简介 SPH0645LM4H-B 是一款微型、低功耗、并且具有 I2S 数字输出的底部端口麦克风。I2S 接口简化了系统集成&#xff0c;并允许与数字处理器、应用处理器和微控制器直接互连。 SPH0645LM4H-B 无需外部音频编解码器&#xf…

测试开发之路--Flask 之旅 (三):数据库

背景 通过前两次的努力&#xff0c;我们对环境有了增删查改以及部署和查看日志的能力。 现在已经处于将就可用的状态。但其实还差了很重要的东西&#xff0c;就是权限的管理。 因为不能说每个用户上来都能随便的重启和删除环境吧&#xff0c;太容易出事故了。所以我们想起码有…

我在代码随想录|写代码Day20之二叉树-700. 二叉搜索树中的搜索,98. 验证二叉搜索树,530.二叉搜索树的最小绝对差

学习目标&#xff1a; 博主介绍: 27dCnc 专题 : 数据结构帮助小白快速入门 &#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d; ☆*: .&#xff61;. o(≧▽≦)…