【面试算法笔记】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

相关推荐
怕浪猫7 小时前
RAG 面试 6 连问,从原理到优化全部覆盖
python·算法·面试
陈卫军老师7 小时前
陈卫军语录全集总结:12句话,一条主线
经验分享·笔记
恒锐丰科技林技术员7 小时前
EG2129 带过流保护全桥驱动芯片解析
经验分享·嵌入式硬件·硬件工程
无线通信科研笔记8 小时前
IEEE TVT 2026 论文精读与完整复现|相位误差如何重塑近场 RIS 的幅相响应
论文阅读·人工智能·python·算法·论文笔记
daidaidaiyu8 小时前
ThingsBoard 集群的核心逻辑源码分析
java
mmmmath_38 小时前
二叉树の递归遍历
算法
爱吃奥利奥_wen9 小时前
面向对象三板斧:封装、继承、多态,到底在“装“什么、“承“什么、“变“什么?
开发语言·经验分享·c#
All for pursuit.9 小时前
【位运算-1】338.比特位计数
数据结构·c++·算法·leetcode
我可能是个假开发9 小时前
FTP Unicode 文件名导致 `550` 的问题分析与解决方案
java·开发语言·spring
caoerzhong9 小时前
中小企业上 WMS 该先上哪几块:JeeWMS 开源 Java 仓库管理系统的分批上线清单
java·python·开源