【代码随想录算法训练营-第七天】【哈希表】454,383,15,18

454. 四数相加 II

第一遍

  • 思路
    • 想不出来,除了暴力解法,完全想不出来其他解法,看答案思路了…
    • 学习了两个新的方法:
      • getOrDefault:返回指定键对应的值,如果不存在,则返回默认值
      • containsKey:判断是否包含key
class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        int count = 0;
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums1.length; i++) {
            for (int j = 0; j < nums2.length; j++) {
                int sum = nums1[i] + nums2[j];
                map.put(sum, map.getOrDefault(sum, 0) + 1);
            }
        }
        for (int k = 0; k < nums3.length; k++) {
            for (int l = 0; l < nums4.length; l++) {
                int judge_num = -(nums3[k] + nums4[l]);
                if (map.containsKey(judge_num)) {
                    count += map.get(judge_num);
                }
            }
        }
        return count;
    }
}

383. 赎金信

第一遍

  • 思路
    • 这题想出来了,用了15mins,思考+做题;
    • 做完之后看了一下给的题解范例,使用了数组+字符的ascii码只有0-26;
    • 巧妙的利用了字符串ascii码;
    • 同时,因为利用了数组,数据结构更加简单,用时大幅减少;在这里插入图片描述
class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        Map<String, Integer> map = new HashMap<>();
        for (int i = 0; i < magazine.length(); i++) {
            String word = String.valueOf(magazine.charAt(i));
            map.put(word, map.getOrDefault(word, 0) + 1);
        }
        for (int i = 0; i < ransomNote.length(); i++) {
            String word = String.valueOf(ransomNote.charAt(i));

            if (!map.containsKey(word)) {
                return false;
            }
            if (map.get(word) < 1) {
                return false;
            }
            map.put(word, map.getOrDefault(word, 0) - 1);
        }
        return true;
    }
}
// 代码随想录提供的题解
class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        if (ransomNote.length() > magazine.length()) {
            return false;
        }
        int[] judge = new int[26];
        for (char word : magazine.toCharArray()) {
            judge[word - 'a'] += 1;
        }
        for (char c : ransomNote.toCharArray()) {
            judge[c - 'a'] -= 1;
        }
        for (int i : judge) {
            if (i <= 0) {
                return false;
            }
        }
        return true;
    }
}

15. 三数之和

第一遍

  • 思路
    • 确实没想出来,先记录一下思路,回头看看能不能写出来;
    • 双指针,重点是固定和如何判定去重:
      • 如何判定去重:在移动指针的过程中,如果出现了和为0,则判断左指针的下一个/右指针的前一个,是否是相同数值的元素,如果是的话,left++ or right--
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();
        Arrays.sort(nums);
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] > 0) { 
                return result;
            }

            if (i > 0 && nums[i] == nums[i - 1]) {  
                continue;
            }

            int left = i + 1;
            int right = nums.length - 1;
            while (right > left) {
                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 (right > left && nums[right] == nums[right - 1]) right--;
                    while (right > left && nums[left] == nums[left + 1]) left++;
                    
                    right--; 
                    left++;
                }
            }
        }
        return result;
    }
}

18. 四数之和

第一遍

  • 思路
    • 这次忘记计时了;
    • 大概思想和三书之和一样,只不过多处理一层循环而已;
    • 需要注意的地方是,用例里面会有让int溢出的场景,因此要在判断数之和与targe的大小的时候需要注意;
class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> result = new ArrayList<>();
        Arrays.sort(nums);
        for (int i = 0; i < nums.length - 3; ) {
            if (i > 0 && nums[i] == nums[i - 1]) {
                i++;
                continue;
            }
            for (int j = i + 1; j < nums.length - 2; ) {
                if (j > i + 1 && nums[j] == nums[j - 1]) {
                    j++;
                    continue;
                }
                int l = j + 1, r = nums.length - 1;
                int tmpTarget = target - nums[i];
                while (l < r) {
                    long threeSum = (long) nums[j] + nums[l] + nums[r];
                    if (threeSum > tmpTarget) {
                        r--;
                    } else if (threeSum < tmpTarget) {
                        l++;
                    } else {
                        result.add(Arrays.asList(nums[i], nums[j], nums[l], nums[r]));
                        while (r > l && nums[l] == nums[l + 1]) l++;
                        while (r > l && nums[r] == nums[r - 1]) r--;
                        l++;
                        r--;
                    }
                }
                j++;
            }
            i++;
        }
        return result;
    }
}

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

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

相关文章

redis缓存雪崩、穿透和击穿

缓存雪崩 对于系统 A&#xff0c;假设每天高峰期每秒 5000 个请求&#xff0c;本来缓存在高峰期可以扛住每秒 4000 个请求&#xff0c;但是缓存机器意外发生了全盘宕机或者大量缓存集中在某一个时间段失效。缓存挂了&#xff0c;此时 1 秒 5000 个请求全部落数据库&#xff0c;…

基于springboot+vue心理测试管理系统

摘要 基于Spring Boot 和 Vue 的心理测试管理系统是一个综合利用现代Web开发技术的应用程序。系统采用了Spring Boot作为后端框架&#xff0c;通过其简化的配置和强大的功能提供了稳健的服务器端支持。前端则使用Vue.js&#xff0c;一个灵活、高效的JavaScript框架&#xff0c;…

版本控制系统教程

1.Git的基本介绍 1.1 Git的概念 Git是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目.Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件.Git与常用的版本控制工具CVS&#xff0c;Subversion等不同&#xff…

Windows下安装部署Redis

一、下载 地址&#xff1a;https://github.com/MSOpenTech/redis/releases Redis-x64-3.2.100.msi版的比较简单&#xff0c;下载之后直接下一步&#xff0c;下一步… 即可完成安装部署。 这里主要演示Redis-x64-3.2.100.zip的安装部署过程&#xff0c;将Redis-x64-3.2.100.z…

多语言生成式语言模型用于零样本跨语言事件论证提取(ACL2023)

1、写作动机&#xff1a; 经过预训练的生成式语言模型更好地捕捉实体之间的结构和依赖关系&#xff0c;因为模板提供了额外的声明性信息。先前工作中模板的设计是依赖于语言的&#xff0c;这使得很难将其扩展到零样本跨语言转移设置。 2、主要贡献&#xff1a; 作者提出了一…

Redis的设计、实现

数据结构和内部编码 type命令实际返回的就是当前键的数据结构类型,它们分别是:string(字符串)hash(哈希)、list(列表)、set(集合)、zset (有序集合),但这些只是Redis对外的数据结构。 实际上每种数据结构都有自己底层的内部编码实现,而且是多种实现,这样Redis会在合适的…

linux创建文件并分配权限

linux中对文件的定义 在Linux中&#xff0c;文件是一个具有符号名字的一组相关联元素的有序序列。文件可以包含的内容十分广泛&#xff0c;操作系统和用户都可以将具有一定独立功能的一个程序模块、一组数据或一组文字命名为一个文件。文件名是数据有序序列集合&#xff08;文…

php 的数学常用函数

目录 1.常用列表 2.代码示例 1.常用列表 函数名描述输入输出abs()求绝对值数字绝对值数字ceil()进一法取整浮点数进一取整floor()舍去法求整浮点数直接舍去小数部分fmod()浮点数取余 两个浮点 数,x>y 浮点余数 pow()返回数的n次方基础数n次方乘方值round()浮点数四舍五入…

镜像迁移脚本

在日常的服务部署开发中&#xff0c;我们有时需要迁移环境&#xff0c;将服务器上的私有镜像从一个服务器迁移到另一个服务器中。在以微服务为架构的项目中&#xff0c;我们的一个项目可能存在大量的镜像&#xff0c;对每一个镜像单独进行导出打包迁移即重复又麻烦&#xff0c;…

vivado编译设置、执行设置、bit流生成设置

合成设置 使用“合成设置”可以指定约束集、合成策略、合成选项&#xff0c;以及要生成的报告。选项由选定的定义综合策略或综合报告策略&#xff0c;但您可以用自己的策略覆盖这些策略设置。您可以选择一个选项来查看对话框底部的描述。了解更多有关“合成设置”的信息&#…

【设计模式-03】Strategy策略模式及应用场景

一、简要描述 Java 官方文档 Overview (Java SE 18 & JDK 18)module indexhttps://docs.oracle.com/en/java/javase/18/docs/api/index.html Java中使用到的策略模式 Comparator、comparable Comparator (Java SE 18 & JDK 18)declaration: module: java.base, pa…

品牌出海新篇章:DTC营销与红人矩阵的完美结合

随着全球市场的竞争日益激烈&#xff0c;品牌在出海过程中面临着前所未有的挑战。传统的销售渠道逐渐显得滞后&#xff0c;DTC模式正成为品牌开拓国际市场的新趋势。在这一趋势中&#xff0c;结合红人矩阵的DTC营销策略备受关注&#xff0c;为品牌打开了一扇通向全球市场的大门…

基于爬虫和Kettle的书籍信息采集与预处理

一&#xff1a;爬虫 1、爬取的目标 将读书网上的书籍的基本信息&#xff0c;比如&#xff1a;封面、书名、作者、出版社、价格、出版时间、内容简介、作者简介、书籍目录、ISBN和标签爬取出来&#xff0c;并将爬取的结果放入数据库中&#xff0c;方便存储。 2、网站结构 图1读…

利用网络威胁情报增强网络安全态势

在当今的网络威胁形势下&#xff0c;明智且主动的防御策略至关重要。网络威胁情报是组织的重要工具&#xff0c;可帮助他们预测和应对网络风险。网络威胁情报不仅提供原始数据&#xff0c;还提供&#xff1a; 深入了解网络攻击者的动机了解他们的潜在目标了解他们的战术 通过…

如何运用TRIZ理论解决电动汽车的续航里程问题?

电动汽车的普及在很大程度上受到续航里程的制约。面对这一问题&#xff0c;传统的解决方案往往只能治标不治本。然而&#xff0c;TRIZ理论为我们提供了一个全新的视角&#xff0c;帮助我们从根本上解决这一难题。 TRIZ&#xff0c;全称为“发明问题解决理论”&#xff0c;是由苏…

java SSM物资采购管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM物资采购管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代 码和数据库&#xff0c;系统主要采…

JDBC-数据库连接池(druid)

一、背景 在介绍JDBC基本概念中&#xff0c;似乎Java程序每次与数据库交互都要通过驱动创建一个新的连接对象&#xff08;Connection&#xff09;&#xff0c;再由连接对象创建一个可执行SQL的Statement对象&#xff08;或PreparedStatement对象&#xff09;&#xff0c;操作完…

一键搭建elk

一键启动elk 1. 生成环境的脚本 setup.sh #!/usr/bin/bash# logstash enviroment mkdir -p logstash touch logstash/logstash.conf # shellcheck disableSC1078 echo input {tcp {mode > "server"host > "0.0.0.0"port > 4560codec > jso…

HCIP OSPF实验

任务&#xff1a; 1.使用三种解决ospf不规则区域的方法 2.路由器5、6、7、8、15使用mgre 3.使用各种优化 4.全网可达 5.保证更新安全 6.使用地址为172.16.0.0/16合理划分 7.每个路由器都有环回 拓扑图&IP划分如下&#xff1a; 第一步&#xff0c;配置IP&环回地址…

【面试突击】网关系统面试实战

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术 的推送 发送 资料 可领取 深入理…
最新文章