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

相关推荐
重生之小比特2 小时前
【Java SE】字符串 - String类
java·开发语言·intellij-idea
mldong8 小时前
给若依加审批流,不用 Flowable
java·spring boot·架构
Wang's Blog10 小时前
Java框架快速入门: Spring Security+OAuth2之数据库和实体类的RBAC改造
java·数据库·spring
Niuguangshuo10 小时前
论文解读:CTC,端到端序列识别的开山之作
算法·语音识别
找方案10 小时前
AI+人力资源:AI招聘面试的兴起与争议
人工智能·面试·职场和发展
讳疾忌医丶10 小时前
深度拆解 RocksDB 内核:基于 C++17 的 FIFO 调度状态机与温度阶梯自愈设计
java·c++·算法·架构
M78佐菲10 小时前
51单片机学习笔记:ds18b20要点整理
linux·笔记·嵌入式硬件·学习·51单片机
郑州光合科技余经理10 小时前
国际版外卖系统:税率字段怎么和订单主流程解耦
android·java·开发语言·前端·后端·php·ai编程
毅炼10 小时前
Rover-Suite 开源发布:轻量服务注册中心与网关一体化方案
java·后端·系统架构·gateway
高亦真10 小时前
今天是学习嵌入式的第37天
linux·学习·算法