【面试算法笔记】0302-哈希表-哈希表实现

个人主页:https://github.com/zbhgis

前言

本系列主要记录自己学习算法的过程中的感悟。

力扣705. 设计哈希集合

链接:https://leetcode.cn/problems/design-hashset/description/

注意点

代码

简单数组

TypeScript 复制代码
class MyHashSet {
    boolean[] nodes = new boolean[1000009];
    
    public void add(int key) {
        nodes[key] = true;
    }
    
    public void remove(int key) {
        nodes[key] = false;
    }
    
    public boolean contains(int key) {
        return nodes[key];
    }
}

链表解法

Java 复制代码
class MyHashSet {
    private static final int BASE = 769;
    private LinkedList<Integer>[] data;
    public MyHashSet() {
        data = new LinkedList[BASE];
        for (int i = 0; i < BASE; i ++) {
            data[i] = new LinkedList<>();
        }
    }

    private int hash(int key) {
        return key % BASE;
    }
    
    public void add(int key) {
        int h = hash(key);
        if (!data[h].contains(key)) {
            data[h].add(key);
        }
    }
    
    public void remove(int key) {
        int h = hash(key);
        data[h].remove((Integer) key);
    }
    
    public boolean contains(int key) {
        int h = hash(key);
        return data[h].contains(key);
    }
}

/**
 * Your MyHashSet object will be instantiated and called as such:
 * MyHashSet obj = new MyHashSet();
 * obj.add(key);
 * obj.remove(key);
 * boolean param_3 = obj.contains(key);
 */

时空复杂度分析

力扣706. 设计哈希映射

链接:https://leetcode.cn/problems/design-hashmap/description/

注意点

代码

简单数组

Java 复制代码
class MyHashMap {
    int INF = Integer.MAX_VALUE;
    int N = 1000009;
    int[] map = new int[N];
    public MyHashMap() {
        Arrays.fill(map, INF);
    }
    
    public void put(int key, int value) {
        map[key] = value;
    }
    
    public int get(int key) {
        return map[key] == INF ? -1 : map[key];
    }
    
    public void remove(int key) {
        map[key] = INF;
    }
}

链表解法

Java 复制代码
class MyHashMap {
    private static final int BASE = 769;
    private class Node {
        int key;
        int value;
        Node next;
        Node(int key, int value) {
            this.key = key;
            this.value = value;
        }
    }

    private Node[] buckets;

    public MyHashMap() {
        buckets = new Node[BASE];
    }
    
    private int hash(int key) {
        return key % BASE;
    }
    
    public void put(int key, int value) {
        int h = hash(key);
        Node head = buckets[h];
        
        Node cur = head;
        while (cur != null) {
            if (cur.key == key) {
                cur.value = value;
                return;
            }
            cur = cur.next;
        }
        
        Node newNode = new Node(key, value);
        newNode.next = head;
        buckets[h] = newNode;
    }
    
    public int get(int key) {
        int h = hash(key);
        Node cur = buckets[h];
        
        while (cur != null) {
            if (cur.key == key) {
                return cur.value;
            }
            cur = cur.next;
        }
        
        return -1;
    }
    
    public void remove(int key) {
        int h = hash(key);
        Node head = buckets[h];
        
        if (head != null && head.key == key) {
            buckets[h] = head.next;
            return;
        }
        
        Node prev = head;
        Node cur = head == null ? null : head.next;
        
        while (cur != null) {
            if (cur.key == key) {
                prev.next = cur.next;
                return;
            }
            prev = cur;
            cur = cur.next;
        }
    }
}

/**
 * Your MyHashMap object will be instantiated and called as such:
 * MyHashMap obj = new MyHashMap();
 * obj.put(key,value);
 * int param_2 = obj.get(key);
 * obj.remove(key);
 */

时空复杂度分析

参考

https://programmercarl.com/哈希表理论基础.html

相关推荐
zh731418 分钟前
typephp的编译核心phpx原理解析
android·java·开发语言
FakeOccupational1 小时前
【github 有趣项目】OpenPLC: 支持通用硬件的开源 PLC 软件平台‌
笔记
2401_894915532 小时前
GEO 优化源码全解析:从搜索引擎到 AI 引擎的底层改写逻辑
java·服务器·前端·数据库·人工智能·分布式·搜索引擎
1000世界小札4 小时前
《大话数据结构》第9章精读:归并排序与快速排序完整 C++ 实现
数据结构·c++·算法
2601_956121976 小时前
背包基础篇(01、完全、分组、多重、混合)
c++·算法·动态规划
Java牛马6 小时前
SpringBoot Starter 依赖相关总结
java·spring·springboot·starter·自动装配·依赖
吴声子夜歌7 小时前
Java面试——Spring Cloud原理及应用(二)
java·spring cloud·面试
xian_wwq7 小时前
【学习笔记】-深度认知系列-第2讲-大模型到底是什么?——拆解“参数、训练、推理”
笔记·学习·深度认知
东小西7 小时前
【SAA实战】第 1 篇:ReactAgent 入门——先撸个"会调工具的助手"跑起来
java·人工智能·spring
黄敬峰7 小时前
一文搞懂 Docker + Dockerfile:从镜像构建到全栈部署
面试