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

文章目录

  • [一. 力扣 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());
    }
相关推荐
voice6707 分钟前
密码学实验二
算法·密码学·哈希算法
西西学代码17 分钟前
Flutter---个人信息(5)---持久化存储
java·javascript·flutter
陈果然DeepVersion22 分钟前
Java大厂面试真题:Spring Boot+Kafka+AI智能客服场景全流程解析(五)
java·spring boot·kafka·向量数据库·大厂面试·rag·ai智能客服
FAFU_kyp29 分钟前
Spring Boot 邮件发送系统 - 从零到精通教程
java·网络·spring boot
脚踏实地的大梦想家1 小时前
【Docker】P2 Docker 命令:从Nginx部署到镜像分享的全流程指南
java·nginx·docker
Blossom.1181 小时前
把AI“编”进草垫:1KB决策树让宠物垫自己报「如厕记录」
java·人工智能·python·算法·决策树·机器学习·宠物
芒克芒克1 小时前
ssm框架之Spring(上)
java·后端·spring
消失的旧时光-19431 小时前
Android ble理解
java·kotlin
寂静山林1 小时前
UVa 10989 Bomb Divide and Conquer
算法
晨晖21 小时前
SpringBoot的yaml配置文件,热部署
java·spring boot·spring