当前位置: 首页 > news >正文

算法奇妙屋(六)-哈希表

文章目录

  • 一. 力扣 1. 两数之和
    • 1. 题目
    • 2. 算法原理
      • (1) 暴力解法1, 2:
      • (2) 哈希解法:
    • 3. 代码
      • (1) 暴力解法1, 2:
      • (2) 哈希解法:
  • 二. 力扣 面试题 01.02. 判定是否互为字符重排
    • 1. 题目
    • 2. 算法原理
    • 3. 代码
  • 三. 力扣 217.存在重复元素
    • 1. 题目
    • 2. 算法原理
    • 3. 代码
  • 四. 力扣 219. 存在重复元素 II
    • 1. 题目
    • 2. 算法原理
    • 3. 代码
  • 五. 力扣 49. 字母异位词分组
    • 1. 题目
    • 2. 算法原理
    • 3. 代码

一. 力扣 1. 两数之和

1. 题目

提议十分简单,即求两数之和等于目标值的下标,并且下标不能出现两次
在这里插入图片描述

2. 算法原理

(1) 暴力解法1, 2:

1: 固定一个数,向后找
2: 固定一个数,向前找
在这里插入图片描述

(2) 哈希解法:

在这里插入图片描述

3. 代码

(1) 暴力解法1, 2:

// 暴力解法 1public int[] twoSum(int[] nums, int target) {int n = nums.length;int[] ret = new int[2];for (int i = 0; i < n; i++) {for (int j = i + 1; j < n; j++) {if (nums[i] + nums[j] == target) {ret[0] = i;ret[1] = j;return ret;}}}return null;}
// 暴力解法 2public int[] twoSum(int[] nums, int target) {int n = nums.length;int[] ret = new int[2];for (int i = 1; i < n; i++) {for (int j = i - 1; j >= 0; j--) {if (nums[i] + nums[j] == target) {ret[0] = i;ret[1] = j;return ret;}}}return null;}

(2) 哈希解法:

    public int[] twoSum(int[] nums, int target) {int[] ret = new int[2];Map<Integer,Integer> hash = new HashMap<>();for (int i = 0; i < nums.length; i++) {int pool = target - nums[i];int index = hash.getOrDefault(pool,-1);if ( index != -1) {ret[0] = index;ret[1] = i;return ret;}hash.put(nums[i], i);}return null;}

二. 力扣 面试题 01.02. 判定是否互为字符重排

1. 题目

这道题比较简单, 具体看题意即可
在这里插入图片描述

2. 算法原理

在这里插入图片描述

3. 代码

    public boolean CheckPermutation(String s1, String s2) {if (s1.length() != s2.length()) {return false;}int n = s1.length();int[] hash = new int[26];for (int i = 0; i < n; i++) {hash[s1.charAt(i) - 'a']++;}for (int i = 0; i < n; i++) {hash[s2.charAt(i) - 'a']--;if ((hash[s2.charAt(i) - 'a']) < 0) {return false;}}return true;}

三. 力扣 217.存在重复元素

1. 题目

在这里插入图片描述

2. 算法原理

这里的算法原理十分简单, 用set模拟哈希表即可快速解决
在这里插入图片描述

3. 代码

    public boolean containsDuplicate(int[] nums) {Set<Integer> hash = new HashSet<>();for (int i = 0; i < nums.length; i++) {if (hash.contains(nums[i])) {return true;}hash.add(nums[i]);}return false;}

四. 力扣 219. 存在重复元素 II

1. 题目

相比于上一道题只是增加了下标的差值<=k这个条件
在这里插入图片描述

2. 算法原理

在这里插入图片描述

3. 代码

    public boolean containsNearbyDuplicate(int[] nums, int k) {Map<Integer,Integer> hash = new HashMap<>();for (int i = 0; i < nums.length; i++) {int index = hash.getOrDefault(nums[i], -1);if (index != -1 && Math.abs(i - index) <= k) {return true;}hash.put(nums[i], i);}return false;}

五. 力扣 49. 字母异位词分组

1. 题目

这道题有点像第二题的变种, 这里多了一步是将所有互为重排序的字符串放到一个集合
在这里插入图片描述

2. 算法原理

在这里插入图片描述

3. 代码

这里面需要注意的是, 排序后不可以直接使用toString将ch数组转为字符串, 这会导致字符串常量池无法存入, 导致值相同的字符串获取的的哈希地址不同, 会导致hash表中一个值对应多个val, 因为在哈希表中存入的string类型存的是哈希地址

    public List<List<String>> groupAnagrams(String[] strs) {List<List<String>> lists = new ArrayList<>();Map<String, List<String>> hash = new HashMap<>();for (String str : strs) {char[] ch = str.toCharArray();Arrays.sort(ch);String s = new String(ch);List<String> list = hash.getOrDefault(s, new ArrayList<>());list.add(str);hash.put(s,list);}return new ArrayList(hash.values());}
http://www.dtcms.com/a/479236.html

相关文章:

  • Java基础加强14-File、字符的编码与解码、IO流、IO框架
  • [算法练习]Day 8: 变长滑动窗口
  • 做网站联系wordpress怎么做背景图片
  • 道路建设网站专题上海网站seo设计
  • asp.net做网站系统wordpress 首页不显示
  • GESP2025年9月认证C++四级( 第三部分编程题(1)排兵布阵)
  • 论文解读 -- A FOUNDATION MODEL FOR MUSIC INFORMATICS
  • Redis-管道和发布订阅
  • 做网站最大可以做多少g代做网站多少钱
  • PostgreSQL 模式(Schema)详解
  • 网站网页制作及优化网站建设收费明细表
  • 网站建设的物流包装设计用什么软件
  • Java 大视界 -- Java 大数据流处理中的状态管理与故障恢复技术深度解析
  • 大型语言模型实战入门:从 API 到开源模型,掌握文本生成与对话核心技能
  • GEO优化公司
  • 做海报文案的参考网站wordpress压缩图片质量
  • HashMap的put方法的具体流程(高频)
  • 龙岩做网站开发多久时间wordpress onethink
  • 自己建网站做淘宝客网站建设的要点是什么
  • 服务器里面如何做网站中国的网站域名是什么意思
  • MQTT和WebSocket的差别
  • org的域名网站导航网源码
  • 网站开发合同封面学会网站建设三方协议
  • wordpress登陆背景seo免费网站建设
  • 烟台企业自助建站系统wordpress最多支持多少会员
  • 计算机毕业设计选题推荐:基于SpringBoot+Vue的前后端分离网吧管理系统(附源码+文档+调试+讲解)
  • 常平镇网站建设wordpress get_user_id
  • 【FFmpeg】销毁解码器时,必须清理剩余帧吗?
  • 烟台网站制作建设医生可以自己做网站吗
  • CV论文速递:覆盖视频生成与控制、图像视频修复、AIGC检测与隐私保护等方向!(10.06-10.10)