Leetcode记录库数据结构篇之四:哈希表

力扣哈希表 罗马数字是通过添加从最高到最低的小数位值的转换而形成的。将小数位值转换为罗马数字有以下规则:如果该值不是以 4 或 9 开头,请选择可以从输入中减去的最大值的符号,将该符号附加到结果,减去其值,然后将其余部分转换为罗马数字。思路,先根据题意传入两个参数一个数组,一个目标值,在这里用hashmap键值对存储来进行遍历查询,1.创建hashmap对象,2.for循环来遍历整个初始数组,在里面定义一个a来表示另一个目标数的另一个和数,在map里面查询有a就返还当前的下标i,以及a的下标。只有 10 的次方( 阅读详情

结论

一些很主观的东西,归根到底可能还是自己的实力不够:

哈希表和集合的用法很像,都可以用来去重。而且他们的操作时间复杂度都是O(1)的。
哈希表经常用在动态规划的思想里做dp记忆。

1 1. 两数之和

题目

思路描述

  • 暴力O(n2)

代码实现
java代码:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int ft = 0, snd = 0, n = nums.length;
        for(; ft < n; ft++){
            for(snd = ft + 1; snd < n; snd++){
                if(nums[ft] + nums[snd] == target){
                    return new int[]{ft, snd};
                }
            }
        }

        return new int[]{ft, snd};
    }
}

思路描述

  • 现将数组转成哈希表,在转换的过程中判断是否有 key = target - nums[i] 已经存在了,如果存在则找到了一对数字满足要求。

代码实现
java代码:

class Solution {
    public boolean containsDuplicate(int[] nums) {
        HashMap<Integer, Integer> map = new HashMap<>();
        int n = nums.length;
        for(int i = 0; i < n; i++){
            if(map.containsKey(nums[i])){
                return true;
            } else {
                map.put(nums[i], 1);
            }
        }

        return false;
    }
}

注意事项

  1. 注意事项

拓展延伸

  1. 拓展延伸

2 217. 存在重复元素

题目

思路描述

  • 现将数组转成哈希表,在转换的过程中判断是否有 key = nums[i] 已经存在了,如果存在则存在重复数组。
  • 时间复杂度O(n), 空间O(n)

代码实现
java代码:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer, Integer> map = new HashMap<>();
        int n = nums.length;
        for(int i = 0; i < n; i++){
            if(map.containsKey(target - nums[i]) == true){
                return new int[]{map.get(target - nums[i]), i};
            } else {
                map.put(nums[i], i);
            }
        }

        return new int[]{0 , 0};
    }
}

思路描述

  • 先将数组转成集合,在最后判断集合的 size 与 nums 的length的关系。
  • 集合会自动去重,时间复杂度O(n), 空间O(n)

代码实现
java代码:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Set<Integer> set = new HashSet<>();
        for (int num : nums) {
            set.add(num);
        }

        return set.size() < nums.length;
    }
}

注意事项

  1. 注意事项

拓展延伸

  1. 拓展延伸

3 594. 最长和谐子序列

题目

思路描述

  • 题目中没有要求保留原始顺序,所以我们现将 nums 转成 map(nums[i], 元素出现次数),然后对每一个 nums[i] 求出 nums[i] + 1 的出现的次数 + nums[i] 出现的次数,找到这个最大值即为所求。

代码实现
java代码:

class Solution {
    public int findLHS(int[] nums) {
        HashMap<Integer, Integer> map = new HashMap<>();
        int longest = 0;
        for(int num : nums){
            map.put(num, map.getOrDefault(num, 0) + 1);
        }
        for(int num : nums){
            if(map.containsKey(num + 1)){
                longest = Math.max(longest, map.get(num) + map.get(num + 1));
            }
        }

        return longest;
    }
}

注意事项

  1. 注意事项

拓展延伸

  1. 拓展延伸

4 128. 最长连续序列

题目

思路描述

  • 这道题用到了动态规划
  • 首先写的是递归的方式

代码实现
java代码:

class Solution {
    HashMap<Integer, Integer> map = new HashMap<>(); // dp
    public int longestConsecutive(int[] nums) {
        int maxLen = 0; // 默认最小长度
        for(int num : nums){
            map.put(num, 1); // 转为map
        }
        
        for(int num : nums){
            int cnt = findLess(num - 1) + 1; // 递归找到每一个数字的前导连续递增数字的个数
            map.put(num, cnt); // 记录
            maxLen = Math.max(maxLen, cnt); // 更新最大值
        }

        return maxLen;
    }

    private int findLess(int num){ // 递归逻辑
        if(!map.containsKey(num)){ // 如果当前map中没有此数字,返回0
            return 0;
        }
        if(map.get(num) > 1){ // 如果num出现的次数大于1,说明这个数字的前导串长度已经找过了,直接返回
            return map.get(num);
        }
        int numLen = 1 + findLess(num - 1); // 否则递归寻找前导串长度
        map.put(num, numLen); // 更新
        return numLen;
    }
}

思路描述

  • 迭代实现

代码实现
java代码:

class Solution {
    HashSet<Integer> set = new HashSet<>(); // dp
    public int longestConsecutive(int[] nums) {
        int maxLen = 0; // 默认最小长度
        for(int num : nums){
            set.add(num); // 转为set
        }
        
        for(int num : nums){
            if(!set.contains(num + 1)){ // 如果存在num + 1,说明不用从num开始计算,因为num + 1的长度一定更长
                int cntNum = num;
                int len = 1;

                while(set.contains(--cntNum)){ // 如果存在--cntNum
                    len++;
                }
                maxLen = Math.max(maxLen, len);
            }
        }

        return maxLen;
    }
}

注意事项

  1. 注意事项

拓展延伸

  1. 拓展延伸

5 1436. 旅行终点站

题目

思路描述

  • 使用map,首先遍历给出的 List ,将其中给出的路径对转成 map 中的 <K, V> 数据对
  • 然后,在遍历 map ,查看哪个 V 再做 K 时没有与之对应的 V , 说明 V 是终点。

代码实现
java代码:

class Solution {
    public String destCity(List<List<String>> paths) {
        HashMap<String, String> map = new HashMap<>();

        for (List<String> path : paths) {
            map.put(path.get(0), path.get(1));
        }

        String city = paths.get(0).get(0); // 获取 List 中的第一个城市作为起点
        while(map.containsKey(city)){
            city = map.get(city);
        }

        return city;
    }
}

注意事项

  1. 注意事项

拓展延伸

  1. 遍历List的四种方法:
public class Test {
    public static void main(String[] args) {
        // 循环遍历List的4中方法
        List<String> strList = new ArrayList<>();
        strList.add("aaa");
        strList.add("bbb");
        strList.add("ccc");
        // 1. 普通遍历方式
        for (int i = 0; i < strList.size(); i++) {
            System.out.println(strList.get(i));
        }
        // 2.增强的for循环
        for (String str : strList) {
            System.out.println(str);
        }
        // 3. 使用Iterator迭代器
        Iterator<String> it = strList.iterator();
        while (it.hasNext()) {
            String str = (String) it.next();
            System.out.println(str);
        }
        // 4. java8 Lambda方式
        // strList.forEach(System.out::println);//和下面的写法等价
        strList.forEach(str -> {
            System.out.println(str);
        });
    }
}
  1. 获取List中指定元素的方法。
public static void main(String[] args){
    List<String>list = new ArrayList<String>();
    list.add("保护环境");  //向列表中添加数据
    list.add("爱护地球");  //向列表中添加数据
    list.add("从我做起");  //向列表中添加数据
    String ret = list.get(1);
    System.out.println("获取索引位置为1的元素:"+ret);
}

运行结果如下:
获取索引位置为1的元素:爱护地球

6 剑指 Offer 03. 数组中重复的数字

题目

思路描述

  • 最基本的想法:使用哈希表进行计数,判断某个数字出现的次数。
  • 但是这样的解法,不管是使用计数法还是新建HashMap都会有较高的空间复杂度。
  • 时空复杂度O(n) O(n)

代码实现
java代码:

class Solution {
    public int findRepeatNumber(int[] nums) {
        // 计数法
        int[] count = new int[100001];
        Arrays.fill(count, 0);
        int n = nums.length;
        int tmp;
        for (int i = 0; i < n; i++) {
            tmp = ++count[nums[i]];
            if (tmp == 2) {
                return nums[i];
            }
        }

        return -1;
    }
}

思路描述

  • 进阶方法是:以索引值作为数组元素的哈希位置,判断是否发生了哈希冲突。
  • 时空复杂度O(n) O(1)

代码实现
java代码:

class Solution {
    public int findRepeatNumber(int[] nums) {
        int n = nums.length;
        int i = 0, tmp;
        while (i < n) {
            if (nums[i] == i) { // 如果元素值等于它所处的索引位置,说明这个元素位置是正确的
                i++; // 向后遍历
                continue;
            }
            // 如果元素值不等于它所处的索引位置,让其归位
            tmp = nums[i]; // 暂存
            if (nums[tmp] == tmp) { // 如果我们发现当前元素值对应的索引位置上以及有了相同的元素,说明找到了重复元素
                return tmp; // 返回
            }
            nums[i] = nums[tmp]; // 否则进行位置交换,将当前元素放到正确的位置上
            nums[tmp] = tmp;
        }

        return -1; // 没有重复元素
    }
}

注意事项

  1. 注意事项

拓展延伸

  1. 遍
FastBuilding 3DMAX插件:批量生成配楼,让建筑可视化告别手动重复建模 在建筑可视化与城市规划项目中,配楼群是营造城市氛围和方案完整度的关键,但几十上百栋配楼的建模往往成为工期瓶颈。传统复制粘贴或BOX贴图方式无法兼顾真实感与效率。FastBuilding作为一款3DMAX插件,通过参数化生成逻辑,将配楼制作转化为可调控的流水线:设定层高、面宽、窗户密度等参数,即可在视口内实时生成带完整外立面细节的实体模型;支持点选拉框和样条线批量生成两种模式,配合随机种子可快速产出丰富而不失协调的建筑群。该插件不仅面数控制合理,生成模型仍可继续编辑,尤其适合住宅区鸟瞰、规划投标及远景天际线等 阅读详情

相关推荐

用Python和NumPy搞定复合材料层合板ABD矩阵计算(附完整代码与避坑指南)

本文详细介绍了如何使用Python和NumPy高效计算复合材料层合板的ABD刚度矩阵,包括单层板刚度计算、偏轴转换和层合板刚度集成。通过完整的代码示例和工程实践技巧,帮助工程师快速构建定制化分析工具,解决航空航天、汽车制造等领域的复合材料力学性能分析问题。特别提供了避坑指南和性能优化策略,确保计算结果的准确性和效率。

weixin_30752699的博客 277

数据结构之哈希表(散列表)

本文附带部分leetcode的例题和伪代码 哈希表 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构 也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度 采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表(Hash table) 哈希表hashtable(key,value) 就是把Key通过一个固定的算法函数(哈希函数)转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,

qq_44095715的博客 1141

Labview及NI-USRP驱动安装教程

软件下载 安装使用的LabVIEW2018及NI-USRP驱动程序已上传,下载地址: 天翼云盘链接 (访问码:oc33) 百度网盘链接 (提取码:88mi) (注:天翼云盘下载不限速) LabVIEW2018安装步骤 右键软件压缩包选择解压至LabVIEW2018 选中文件,鼠标右击选择以管理员身份打开2018LV-WinChn.exe文件。 点击确定。 点击Unzip解压。 点击确定。 点击下一步。 填写任意信息后,点击下一步。 点击下一步。 点击浏览更改安装路径建议安装到除C盘以

dadapongi6的博客 2万+

leetcode刷题记录——哈希表篇

使用编程语言:Python3哈希表是一种根据键(Key)直接访问内存存储位置的数据结构。通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,从而加快查找速度。这个映射函数称为哈希函数。简单来说,哈希表是根据关键码的值而直接进行访问的数据结构。

qq_52002561的博客 966

STM32实战:5分钟搞定CanFestival协议栈下的CANopen心跳报文配置(附避坑指南)

本文详细介绍了如何在STM32平台上使用CanFestival协议栈快速配置CANopen心跳报文,包括硬件准备、协议栈移植、心跳报文配置及常见问题解决方案。通过实战步骤和避坑指南,帮助开发者高效实现节点状态监控,提升工业控制系统的可靠性。

win55的博客 745

k8s学习笔记(3)--- kubernetes核心技术概念

kubernetes核心技术概念 1.API对象         API对象是K8s集群中的管理操作单元。K8s集群系统每支持一项新功能,引入一项新技术,一定会新引入对应的API对象,支持对该功能的管理操作。例如副本集Replica Set对应的API对象是RS。 2.集群(Cluster)         集群是指由...

梦谜的博客 1291

c++数据结构与算法学习记录-哈希表(力扣202题快乐数)

一.哈希表概念哈希冲突**哈希函数**二.哈希结构-集合三.题目描述四.思路五.代码。

weixin_54773625的博客 1652

麒麟v10系统安装

麒麟v10系统安装

喜文BLOG 1万+

Leetcode 刷题笔记:哈希表篇

Leetcode刷题笔记:哈希表篇

qq_27673853的博客 1836

Oracle EBS Interface/API(29) - AP发票API

续上编文章《Oracle EBS Interface/API(28) - 客制化开发AP付款API》背景,介绍如调用官方提供标准AP发票API调用 用户界面 Invoices(Payables Manager->Invoices->Entry->Invoices) Open Interface Invoices(Payables Manager->Invoices->Entry->Open Interface Invoices) 快速参考 参考点 内容.

陈显平的专栏-Oracle EBS 1150

基于RK3568的YOLOv11模型端侧推理优化与部署实战指南

在AI边缘计算领域,瑞芯微RK3568芯片凭借其强大的NPU算力和丰富的接口资源,成为了众多开发者的首选平台。然而,瑞芯微官方文档虽然提供了YOLO11预训练模型的部署方案,但对于需要自定义数据集训练的开发者来说,从模型训练到板端部署的完整流程却缺乏详细指导。本文将带你走完从环境搭建、数据准备、模型训练到最终板端部署的完整技术路线,并分享实际开发中遇到的各种坑点和解决方案。让我们一起探索如何在RK3568平台上实现30FPS稳定推理的YOLO11目标检测应用!

m0_64661770的博客 115

力扣LeetCode-哈希表

哈希表 一、基本知识点 1. 定义 哈希表是根据关键码的值而直接进行访问的数据结构。 2. 解决问题 快速判断一个元素是否出现集合里。 3. 哈希碰撞解决方法 拉链法与线性探测法。 4. 常见的三种哈希结构 数组 set(集合) map(映射) 集合 底层实现 是否有序 数值是否可以重复 能否更改数值 查询效率 增删效率 std::set 红黑树 有序 否 否 O(logn) O(

weixin_56005963的博客 538

CryoEM - 使用 ChimeraX 工具 操作 冷冻电镜的 MRC 密度图(Density Map) 教程

由冷冻电镜 CryoSparc 软件所生成的 Volume,需要观察其内部结构,建议使用 ChimeraX 进行操作。

AGI 4959

【leetcode】记录与查找:哈希表的题型分析

本期主要讲解了关于hash函数的力扣相关题型,两数之和,存在重复字符2,字母异位词分组

GGBond778的博客 2160

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Leetcode刷题笔记——哈希表篇

本文给大家介绍了哈希表在面试中的高频考题以及哈希表和其他算法结合的考察形式,可以看到哈希表再结合其他知识点的应用中还是稍稍有点难的,比较考察大家对于数据结构的基础知识(尤其是LRU和设计哈希集合这两道题),祝大家面试顺利,面试碰到原题,找到心仪的offer,冲冲冲~

qq_42898642的博客 1632

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【算法系列篇】哈希表

算法系列篇-哈希表:两数之和、判定是否为字符重排、存在重复元素、存在重复元素II、字母异位词分组

不能再留遗憾了的博客 2052

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

力扣(leetcode)题目总结——字符串篇

本系列文章初衷是为了按类别整理出力扣(leetcode)最经典题目,一共100多道题,每道题都给出了非常详细的解题思路、算法步骤、代码实现。因为力扣题目顺序是随机的,并没有按照算法分类,导致同一类型的算法强化训练不够。所以本系列文章就是来帮你完成算法分类,针对每种算法做强化训练,保证让你以后遇到题目直接秒杀。本篇文章主要是针对字符串相关的算法题,一次性帮你搞定所有字符串题!

weixin_46571171的博客 4778

梦开始的地方:力扣热题100哈希表

在刷力扣100题的征程中,我从哈希相关题目入手,一路探索,收获颇丰。如今,想将自己在这一过程中的思路与感悟进行一番总结,既为记录成长,也希望能给同样在算法之路上前行的朋友们提供一些参考。哈希表的卓越之处在于,在平均情况下,它能够以近乎常数时间(O1O(1)O1)的速度执行插入、删除和查找操作,这一特性使其在众多算法场景中大放异彩。在后续的探索中,我会持续在这篇博客中更新更多关于哈希的力扣题目及解题思路,与大家一同在算法的海洋中遨游,不断提升自我。

m0_46318653的博客 1850

力扣每日一题:哈希表求数之和汇总

力扣每日一题:哈希表汇总 文章目录力扣每日一题:哈希表汇总哈希表理论哈希函数常见的三种哈希结构题目汇总两数之和三数之和四数之和 哈希表理论 参考:https://programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html#%E5%B8%B8%E8%A7%81%E7%9A%84%E4%B8%89%E7%A7%8D%E5%93%88%E5%B8%8C%E7%BB%93%E6%9E%84 定义:哈希

qq_43654669的博客 1154

Leetcode学习:哈希表

哈希表(Hash Table):也叫做散列表。是根据关键码值(Key Value)直接进行访问的数据结构。哈希表通过「键 key 」和「映射函数 Hash(key) 」计算出对应的「值 value」,把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做「哈希函数(散列函数)」,存放记录的数组叫做「哈希表(散列表)」。

m0_47199013的博客 510

LEETCODE的第一题——两数之和(哈希表)

本文主要用于记录刷力扣的题解,,因为自己算法太菜,所以想通过深度学习力扣的每一道题目的原理来提高自己。下面内容为自己学习时的记录,如有错误,欢迎指正🍭。

everything is possible,anything is OK. 1313

LeetCode Hot100实战之哈希表

那么从今天开始到未来的几个月的时间里,我将会为大家带来LeetCode中算法题的总结和思考。也算是对于自身算法学习的一种记录,同时分享给大家。我们先从LeetCode Hot100开始。本次分享,主要带来的是LeetCode Hot100中的哈希表。由于哈希的内容比较简单,我们可以一次性就说完。

jxwd的博客 1114

力扣刷题记录

Leecode

Mr_Liuss的博客 2636

数据结构——哈希表leetcode题目

从这里可以看出,无限循环时必定会出现数字的复现,用数学的角度分析一下知道不可能一直出现不同的数字 (但数值较大时,这种运算显然使数据变得很小),于是判断快乐数很简单,到1就是快乐数,判断非快乐数也有窍门,就是复现某些数字,那如何储存已有数字呢,就是用哈希表!「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。编写一个算法来判断一个数 n 是不是快乐数。

2301_79376014的博客 1086

力扣,哈希表,(滑动窗口),242,(209),438

b.思路,小写字母a-z变为0-25,先s中记录每个字母出现的次数,档t再出现时,对应的下标相同的数-1,最终的值都为0时,则是有效的字母异位词。=0){//有不为0时,则是多一个或者少一个字母。用来快速判断一个元素是否出现集合里,只需要O (1)复杂度就可以做到,不需要遍历。// 如果t与s中有相同的元素,则-1;哈希表(Hash Table),又称散列表,是一种通过。// 使用哈希表,数组。// 先创建一个数组,a,理解题目,字母位置不同,字母相同。e.真正的代码,使用java。,编写一个函数来判断。

wqs12_的博客 965

代码随想录+力扣刷题记录+华为机考准备记录

为了准备华为机考的刷题记录(不全)(已挂,春招再战)为了准备华为机考的刷题记录(不全)(已挂,春招再战)

LiangManqi0320的博客 2342
上一篇: Leetcode记录库数据结构篇之三:栈和队列
下一篇: Leetcode记录库解题方法篇之一:计数法
LencyGe
博客等级 码龄7年 26粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值