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

相关推荐
她说可以呀16 分钟前
Spring-ai-alibaba文生图
java·人工智能·spring
营养充电站1 小时前
KMP全栈开发:从Android到AI Agent的技术演进与实践
人工智能·算法·docker·jupyter
技术小黑1 小时前
RNN算法实战系列05 | 天气预测
人工智能·rnn·算法
kyriewen2 小时前
我重写了自己用了两年的防抖节流Hook——发现里面藏着3个隐藏bug
前端·javascript·面试
松仔log2 小时前
Java中级——组合和继承
android·java·开发语言
不才不才不不才2 小时前
Spring 源码系列(16): doDispatch 全流程——一次请求的主干链路
java·后端·spring
snow@li3 小时前
HikariCP:高性能数据库连接池全景深入梳理
java·数据库
Hotchip_MEMS3 小时前
当雾化器遇上MEMS:一场从交互到制造的全链路效率提升
人工智能·笔记·物联网·电脑·制造
edwarddamon3 小时前
Spring Cloud 配置热更新与 Bean 代理机制梳理
java·后端
是上好佳佳佳呀3 小时前
【深度学习|Day02】PyTorch 深度学习笔记(下):张量运算与自动微分
pytorch·笔记·深度学习