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

文章目录

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

一. 力扣 1. 两数之和

1. 题目

提议十分简单,即求两数之和等于目标值的下标,并且下标不能出现两次

2. 算法原理

(1) 暴力解法1, 2:

1: 固定一个数,向后找
2: 固定一个数,向前找

(2) 哈希解法:

3. 代码

(1) 暴力解法1, 2:

java 复制代码
// 暴力解法 1
    public 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;
    }
java 复制代码
// 暴力解法 2
    public 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) 哈希解法:

java 复制代码
    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. 代码

java 复制代码
    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. 代码

java 复制代码
    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. 代码

java 复制代码
    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类型存的是哈希地址

java 复制代码
    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());
    }
相关推荐
SimonKing4 小时前
OpenCode AI辅助编程,不一样的编程思路,不写一行代码
java·后端·程序员
FastBean4 小时前
Jackson View Extension Spring Boot Starter
java·后端
Seven975 小时前
剑指offer-79、最⻓不含重复字符的⼦字符串
java
皮皮林55115 小时前
Java性能调优黑科技!1行代码实现毫秒级耗时追踪,效率飙升300%!
java
冰_河15 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
地平线开发者15 小时前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮16 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者16 小时前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考16 小时前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习