当前位置: 首页 > article >正文

代码随想录刷题day18|(哈希表篇)01.两数之和

目录

一、哈希表理论基础

二、题目思路及关键点

三、相关算法题目

四、相关知识点

1. Map集合概述和特点

1.1 Map集合概述

1.2 Map集合的特点

2. HashMap集合特点

3. HashMap集合常用方法


一、哈希表理论基础

详见 代码随想录刷题day15|(哈希表篇)242.有效的字母异位词、383.赎金信-CSDN博客

二、题目思路及关键点

思路:新建一个map集合,遍历数组,每遍历一个元素,同时判断map集合中是否存在(target-当前数组元素),如果不存在,将当前元素以及下标存放进map集合中;如果存在,返回map集合中该key对应的value值(即 下标)以及当前数组中遍历元素的下标;

关键点:

为什么用哈希法:遍历一个元素n时,判断之前是否遍历过(target - n)元素;

应该用什么数据结构作为哈希表:本题需要返回符合条件元素的数组下标,所以除了判断元素之前是否遍历过 以外,同时又要知道该元素在数组中的下标,那么就要存放两个元素:数值和下标;由此可知,数组和set集合均不满足条件,应该使用map集合,用map集合的键值对来存放两个元素;

map中key存储什么?value又是什么?key存储数值大小,value存储下标;因为是查找元素是否出现过,所以用key存储数值大小,方便map快速查找;

map的作用:存放遍历过的元素,方便查找;

三、相关算法题目

01.两数之和

1. 两数之和 - 力扣(LeetCode)

class Solution {
    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
        int[] result = new int[2];
        //判断数组是否为空
        if(nums == null || nums.length == 0){
            return result;
        }
        for(int i = 0;i < nums.length;i++){
            int n = target - nums[i]; // 遍历当前元素,并在map中寻找是否有匹配的key
            if(map.containsKey(n)){
                result[0] = i;
                result[1] = map.get(n);
                //return result;
                break;
            }else{
                map.put(nums[i],i);
            }
        }
        return result;
    }
}

四、相关知识点

1. Map集合概述和特点

1.1 Map集合概述

Map集合又叫双列集合,是接口,不可以直接创建对象,只可以通过实现类创建具体对象;Map集合一般包括两个实现类:HashMap 和 TreeMap;前者底层结构是哈希表,后者是红黑树;其包括两个值,是一个键值对;

Map<K,V>  K:键的类型;V:值的类型

1.2 Map集合的特点

  • 双列集合,一个键对应一个值;

  • 键不可以重复,值可以重复;

2. HashMap集合特点

创建HashMap对象 :

  HashMap<Integer, String> hm = new HashMap<Integer, String>();

  • HashMap底层是哈希表结构的;

  • 依赖hashCode方法和equals方法保证键的唯一;

  • 如果键要存储的是自定义对象,需要重写hashCode和equals方法;

3. HashMap集合常用方法

本题所用到的方法:

boolean containsKey(Object key):查询集合中是否包含此key;

V get(Object key):如果有,返回集合中该key对应的value值;

V put(K key, V value):向集合中添加键值对;


http://www.kler.cn/a/522954.html

相关文章:

  • Java面试题2025-并发编程进阶(线程池和并发容器类)
  • 9.8 实战:使用 GPT Builder 开发定制化 ChatGPT 应用
  • MySQL(单表访问)
  • WPF基础 | WPF 常用控件实战:Button、TextBox 等的基础应用
  • Ubuntu 20.04安装Protocol Buffers 2.5.0
  • 世上本没有路,只有“场”et“Bravo”
  • QT:图像上绘制图形
  • 基于Django的个人博客系统的设计与实现
  • 【现代深度学习技术】深度学习计算 | 参数管理
  • Flink (十三) :Table API 与 DataStream API 的转换 (一)
  • TypeScript 学习 -类型 - 9
  • MySQL知识点总结(十二)
  • 树和图的实现与应用:C语言实践详解
  • Docker/K8S
  • C语言中的do……while和while循环有什么区别?
  • MySQL事物,MVCC机制
  • 【搜索回溯算法篇】:多源BFS--从简单BFS到多点协同,探索搜索算法的进化
  • 挂载mount
  • 可扩展架构:如何打造一个善变的柔性系统?
  • LTV预估 | 多视角对比学习框架CMLTV
  • 四层网络模型
  • mybatis(112/134)
  • Windows 程序设计5:文件的删除、复制与重命名操作
  • JVM栈溢出线上环境排查
  • 基于Ubuntu交叉编译ZLMediaKit
  • PCB Editor层叠文件(Gerber文件输出-01)