算法练习01——哈希部分双指针

目录

  • 1. 两数之和(*)
  • 242. 有效的字母异位词(easy)
  • 49. 字母异位词分组(*)
  • 349. 两个数组的交集
  • 202. 快乐数(1.使用Set存哈希,2.快慢指针)
  • 454. 四数相加 II
  • 383. 赎金信
  • 15. 三数之和*(双指针)
  • 18. 四数之和*(双指针)
  • 128. 最长连续序列

1. 两数之和(*)

https://leetcode.cn/problems/two-sum/
在这里插入图片描述

使用map存储遍历过的数组中的值,每遍历到一个元素,就去map集合中查找有没有值为(target-num[i])的元素。
map的key存储数组元素的值,value存储数组元素的下标。

class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer,Integer>map=new HashMap<>();for(int i=0;i<nums.length;i++){if(map.containsKey(target-nums[i])){return new int[]{i,map.get(target-nums[i])};}map.put(nums[i],i);}return null;}
}

242. 有效的字母异位词(easy)

https://leetcode.cn/problems/group-anagrams/

class Solution {public boolean isAnagram(String s, String t) {int hash[]=new int[26];for(int i=0;i<s.length();i++){hash[s.charAt(i)-'a']++;}for(int i=0;i<t.length();i++){hash[t.charAt(i)-'a']--;}for(int i=0;i<26;i++){if(hash[i]!=0){return false;}}return true;}
}

49. 字母异位词分组(*)

https://leetcode.cn/problems/group-anagrams/

由于互为字母异位词的两个字符串包含的字母相同,因此对两个字符串分别进行排序之后得到的字符串一定是相同的,故可以将排序之后的字符串作为哈希表的键。

//方法一:排序class Solution {public List<List<String>> groupAnagrams(String[] strs) {// 创建一个哈希映射,键是排序后的字符串,值是所有对应的异位词Map<String, List<String>> map = new HashMap<String, List<String>>();// 遍历输入的字符串数组for (String str : strs) {// 将当前字符串转换为字符数组char[] array = str.toCharArray();// 对字符数组进行排序Arrays.sort(array);// 将排序后的字符数组转换回字符串,作为哈希映射的键String key = new String(array);// 从哈希映射中获取键对应的异位词列表,如果不存在则返回一个新的列表List<String> list = map.getOrDefault(key, new ArrayList<String>());// 将当前字符串添加到异位词列表中list.add(str);// 将异位词列表放回哈希映射中map.put(key, list);}// 将哈希映射中的所有值(即所有的异位词列表)转换为一个列表返回return new ArrayList<List<String>>(map.values());
}

方法一:计数: `
由于互为字母异位词的两个字符串包含的字母相同,因此两个字符串中的相同字母出现的次数一定是相同的,故可以将每个字母出现的次数使用字符串表示,作为哈希表的键。

由于字符串只包含小写字母,因此对于每个字符串,可以使用长度为 262626 的数组记录每个字母出现的次数。需要注意的是,在使用数组作为哈希表的键时,不同语言的支持程度不同,因此不同语言的实现方式也不同。

  class Solution {public List<List<String>> groupAnagrams(String[] strs) {// 创建一个哈希映射,键是字符计数字符串,值是所有对应的异位词Map<String, List<String>> map = new HashMap<String, List<String>>();// 遍历输入的字符串数组for (String str : strs) {// 创建一个长度为26的数组,用于记录每个字符的出现次数int[] counts = new int[26];int length = str.length();// 遍历当前字符串,更新字符计数数组for (int i = 0; i < length; i++) {counts[str.charAt(i) - 'a']++;}// 创建一个字符串缓冲区,用于构建字符计数字符串StringBuffer sb = new StringBuffer();// 遍历字符计数数组,将每个出现次数大于0的字符和出现次数按顺序拼接成字符串for (int i = 0; i < 26; i++) {if (counts[i] != 0) {sb.append((char) ('a' + i));sb.append(counts[i]);}}// 将字符计数字符串作为哈希映射的键String key = sb.toString();// 从哈希映射中获取键对应的异位词列表,如果不存在则返回一个新的列表List<String> list = map.getOrDefault(key, new ArrayList<String>());// 将当前字符串添加到异位词列表中list.add(str);// 将异位词列表放回哈希映射中map.put(key, list);}// 将哈希映射中的所有值(即所有的异位词列表)转换为一个列表返回return new ArrayList<List<String>>(map.values());
}

349. 两个数组的交集

https://leetcode.cn/problems/intersection-of-two-arrays/

class Solution {public int[] intersection(int[] nums1, int[] nums2) {Set<Integer> resSet=new HashSet<>();Set<Integer> set=new HashSet<>();for(int i:nums1){set.add(i);}for(int i:nums2){if(set.contains(i)){resSet.add(i);}}int j=0;int []arr=new int[resSet.size()];for(int i:resSet){arr[j++]=i;}return arr;}
}

202. 快乐数(1.使用Set存哈希,2.快慢指针)

https://leetcode.cn/problems/happy-number/

class Solution {public boolean isHappy(int n) {//方法一:使用SetHash检测循环Set<Integer> set=new HashSet<>();while(n!=1 && !set.contains(n)){set.add(n);n=getNextNumber(n);}return n==1;//方法二:使用快慢指针检测循环// int fast=getNextNumber(n);// int slow=n;// while(fast!=1 && fast!=slow){//     slow=getNextNumber(slow);//     fast=getNextNumber(getNextNumber(fast));// }// return fast==1;}//将n替换为它每个位置上的数字的平方和。private int getNextNumber(int n) {int res = 0;while (n > 0) {int temp = n % 10;res += temp * temp;n = n / 10;}return res;}
}

454. 四数相加 II

https://leetcode.cn/problems/4sum-ii/

我们可以将四个数组分成两部分,A和 B 为一组,C 和 D 为另外一组。
对于 A 和 B,我们使用二重循环对它们进行遍历,得到所有 A[i]+B[j] 的值并存入哈希映射中。对于哈希映射中的每个键值对,每个键表示一种 A[i]+B[j],对应的值为 A[i]+B[j] 出现的次数。
对于 C 和 D,我们同样使用二重循环对它们进行遍历。当遍历到 C[k]+D[l]时,如果 −( C[k]+D[l] )出现在哈希映射中,那么将 −(C[k]+D[l]) 对应的值累加进答案中。
最终即可得到满足 A[i]+B[j]+C[k]+D[l]=0 的四元组数目。

class Solution {public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {int res = 0;Map<Integer, Integer> map = new HashMap<Integer, Integer>();//统计两个数组中的元素之和,同时统计出现的次数,放入mapfor (int i : nums1) {for (int j : nums2) {int sum = i + j;map.put(sum, map.getOrDefault(sum, 0) + 1);}}//统计剩余的两个元素的和,在map中找是否存在相加为0的情况,同时记录次数for (int i : nums3) {for (int j : nums4) {res += map.getOrDefault(0 - i - j, 0);}}return res;}
}

383. 赎金信

https://leetcode.cn/problems/ransom-note/

class Solution {public boolean canConstruct(String ransomNote, String magazine) {if(ransomNote.length() > magazine.length()){return false;}int []hash=new int[26];for(char ch : magazine.toCharArray()){hash[ch-'a']++;}for(char ch : ransomNote.toCharArray()){hash[ch-'a']--;}for(int i=0;i<26;i++){if(hash[i]<0){return false;}}return true;}
}

15. 三数之和*(双指针)

https://leetcode.cn/problems/3sum/

class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> res=new ArrayList<>();Arrays.sort(nums);for(int i=0;i<nums.length;i++){if(nums[i]>0){return res;}if(i>0 && nums[i]==nums[i-1]){ //去重continue;}int left=i+1;int right=nums.length-1;while(left<right){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]);res.add(list);while(left<right && nums[right]==nums[right-1]){right--;}while(left<right && nums[left]==nums[left+1]){left++;}right--;left++;}}}return res;}
}

18. 四数之和*(双指针)

https://leetcode.cn/problems/4sum/

class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>> res=new ArrayList<>();Arrays.sort(nums);for(int i=0;i<nums.length;i++){if(nums[i]>0 && nums[i]>target){//剪枝return res;}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){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]);res.add(list);while(left<right && nums[right]==nums[right-1]){right--;}while(left<right && nums[left]==nums[left+1]){left++;}right--;left++;}}}}return res;}
}

128. 最长连续序列

https://leetcode.cn/problems/longest-consecutive-sequence/

class Solution {public int longestConsecutive(int[] nums) {int res = 0;    // 记录最长连续序列的长度Set<Integer> numSet = new HashSet<>();  // 记录所有的数值for(int num: nums){numSet.add(num);    // 将数组中的值加入哈希表中}int seqLen;     // 连续序列的长度for(int num: numSet){// 如果当前的数是一个连续序列的起点,统计这个连续序列的长度if(!numSet.contains(num - 1)){seqLen = 1;while(numSet.contains(++num))seqLen++;  // 不断查找连续序列,直到num的下一个数不存在于数组中res = Math.max(res, seqLen);    // 更新最长连续序列长度}}return res;}
}

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

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

相关文章

Gas Hero Common Heroes NFT 概览与数据分析

作者&#xff1a;stellafootprint.network 编译&#xff1a;mingfootprint.network 数据源&#xff1a;Gas Hero Common Heroes NFT Collection Dashboard Gas Hero “盖世英雄” 是一个交互式的 Web3 策略游戏&#xff0c;强调社交互动&#xff0c;并与 FSL 生态系统集成…

备战蓝桥杯---数据结构与STL应用(入门4)

本专题主要是关于利用优先队列解决贪心选择上的“反悔”问题 话不多说&#xff0c;直接看题&#xff1a; 下面为分析&#xff1a; 很显然&#xff0c;我们在整体上以s[i]为基准&#xff0c;先把士兵按s[i]排好。然后&#xff0c;我们先求s[i]大的开始&#xff0c;即规定选人数…

asp.net 404页面配置、 asp.net MVC 配置404页面、iis 配置404页面,指定404错误页面,设置404错误页面

通过标题的三个问题 1、asp.net 404页面配置、 2、asp.net MVC 配置404页面、 3、iis 配置404页面&#xff1b; 可以看出&#xff0c;这是一篇了不得的问题&#xff0c;并进行全面讲解&#xff1b; 除了围绕以上三个核心问题外&#xff0c;我们也对以下2个核心场景也作出分析…

【从零开始的rust web开发之路 三】orm框架sea-orm入门使用教程

【从零开始的rust web开发之路 三】orm框架sea-orm入门使用教程 文章目录 前言一、引入依赖二、创建数据库连接简单链接连接选项开启日志调试 三、生成实体安装sea-orm-cli创建数据库表使用sea-orm-cli命令生成实体文件代码 四、增删改查实现新增数据主键查找条件查找查找用户名…

2024.1.31日总结

服创大赛的有一个选题是【A16】新苗同学 - 大学新生智能迎新平台&#xff0c;这个对前端的要求挺高的&#xff0c;需要设计游戏化页面&#xff0c;刚刚搜索了一下&#xff0c;感觉难度很大&#xff0c;又要有创意&#xff0c;而且动画效果也要不错&#xff0c;整体页面才会美观…

爬虫学习笔记-Cookie登录古诗文网

1.导包请求 import requests 2.获取古诗文网登录接口 url https://so.gushiwen.cn/user/login.aspxfromhttp%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx # 请求头 headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like …

linux解决访问/下载github连接超时或下载慢的问题

问题 我这里是树莓派从github下载资源出现无法连接&#xff0c;连接超时的问题&#xff0c;如下所示解决方式 修改/etc/hosts文件 例&#xff1a; sudo nano /etc/hosts #添加如下 192.30.255.112 github.com git 185.31.16.184 github.global.ssl.fastly.net这里以树莓派为…

【大厂AI课学习笔记】1.3 人工智能产业发展(4)——泛在的人工智能

人工智能走向泛在。 泛在&#xff0c;就是广泛存在。&#xff08;下图来自腾讯AI课。&#xff09; 没办法&#xff0c;被百度抛弃了&#xff0c;想学习&#xff0c;课程打不开&#xff0c;只好投想腾讯的怀抱。 之前考过腾讯云的认证&#xff0c;课程做的还是条理很清晰。 主…

全面掌握Django的web框架Django Rest_Framework(一)

文章目录 Django Rest_Framework1. DRF介绍2.DRF特点3.环境安装与配置&#xff08;1&#xff09;DRF需要以下依赖&#xff08;2&#xff09;创建django项目 4.序列化器的使用&#xff08;1&#xff09;创建序列化器 5. 反序列化器使用 Django Rest_Framework 1. DRF介绍 Djan…

PPT、PDF全文档翻译相关产品调研笔记

主要找一下是否有比较给力的全文档翻译 文章目录 1 百度翻译2 小牛翻译3 腾讯交互翻译4 DeepL5 languagex6 云译科技7 快翻:qtrans8 simplifyai9 officetranslator10 火山引擎翻译-无文档翻译1 百度翻译 地址: https://fanyi.baidu.com/ 配套的比较完善,对于不同行业也有区…

docker安装elasticsearch+kibana

目录 1.安装es 2.安装kibana 3.kibana监控es 1.安装es 拉取镜像 docker pull elasticsearch:7.6.1 创建存放配置文件、数据、插件的各个文件夹 mkdir -p /home/docker/elasticsearch/config mkdir -p /home/docker/elasticsearch/data mkdir -p /home/docker/elasticsearch…

防火墙目标NAT

目录 拓扑需求 目标NAT配置配置配置服务器映射电信&#xff08;DX&#xff09;移动&#xff08;YD&#xff09; 配置NAT策略配置目的端口转换 新建安全策略 测试 拓扑 需求 分公司设备可以通过总公司的移动链路和电信链路访问到DMZ区的http服务器 目标NAT配置 这里主要配置目标…

FFMPEG 之 DXVA2 硬解

一&#xff1a;FFMPEG 支持的硬解方式有很多&#xff1a; DXVA2、D3D11VA、CUDA、QSV、OPENCL、DRM、VAAPI、VDPAU、VIDEOTOOLBOX、MEDIACODEC。 有的支持 Windows 平台&#xff0c;有的支持 linux 平台&#xff0c;有的支持 apple ios 平台&#xff0c;…

Mybatis 源码系列:领略设计模式在 Mybatis 其中的应用

文章目录 一、Builder模式二、工厂模式三、单例模式四、代理模式五、组合模式六、模板方式模式七、适配器模式八、装饰器模式九、迭代器模式 虽然我们都知道有23种设计模式&#xff0c;但是大多停留在概念层面&#xff0c;真实开发中很少遇到&#xff0c;Mybatis源码中使用了大…

代码随想录算法训练营DAY8 | 字符串(1)

一、LeetCode 344 反转字符串 题目链接&#xff1a; 344.反转字符串https://leetcode.cn/problems/reverse-string/ 思路&#xff1a;双指针法交换。 class Solution {public void reverseString(char[] s) {int n s.length;int left 0, right n-1;while(left < right){c…

单元/集成测试服务

服务概述 单元/集成测试旨在证明被测软件实现其单元/架构设计规范、证明被测软件不包含非预期功能。经纬恒润测试团队拥有丰富的研发经验、严格的流程管控&#xff0c;依据ISO26262/ASPICE等开展符合要求的单元测试/集成测试工作。 在ISO 26262 - part6 部分产品开发&#xff…

AD24-第三方网表导入PCB

1、文件路径需要纯英文路径 2、生成网表 3、将网表和PCB库放进工程里 4、进行网表添加 5、新建PCB 6、选择显示差异 7、对所有东西进行更新 8、创建工程变更列表 9、执行变更 总结&#xff1a; ①导出适合AD的网表 ②创建工程 &#xff08;包含网表PCB封装库PCB&#xff09; …

最近宣布的NIST后量子密码学标准的3个关键要点

当今世界依赖于许多保护措施&#xff0c;即使您没有注意到这一点。从手机和智能技术到网站&#xff0c;从支付交易到城市基础设施&#xff0c;人们经常与之互动的一切&#xff0c;都通过保护和检查技术来保护。量子计算机能够快速轻松地打破这些保护措施&#xff0c;这是政府和…

【Qt学习笔记】(一)初识Qt

Qt学习笔记 1 使用Qt Creator 新建项目2 项目代码解释3 创建第一个 Hello World 程序4 关于内存泄漏问题5 Qt 中的对象树6 关于 qDebug&#xff08;&#xff09;的使用7 使用其他方式创建一个 Hello World 程序&#xff08;编辑框和按钮方式&#xff09;8 关于 Qt 中的命名规范…

九、图表使用

一、QCharts概述 Qt图表提供了&#xff1a;折线图、样条曲线图、面积图、散点图、条形图、饼图、方块胡须图、蜡烛图、极坐标图。1、QChart介绍 Qt Charts基于Qt的QGraphics View架构&#xff0c;其核心组件是QChartView和QChartQChartView是显示图标的视图&#xff0c;基类为…