首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

【Java】力扣第一题“两数相加”真的简单吗?我看未必【代码随想录】【HashMap】

  • 25-03-07 21:02
  • 3004
  • 13367
blog.csdn.net

HashMap

我们在做力扣第一题的时候,除了暴力解法之外哈希表是最优解,但是哈希表也有很多种类,比如HashSet、HashMap、数组等,那我们为什么选择HashMap呢?

在Java中,HashMap是一个广泛使用的集合类,实现了Map接口,用于存储键值对(即:key和val)。它基于哈希表实现,提供了快速的查找、插入和删除操作。

以下是关于HashMap的一些重要特点和用法:

重要特点

  • 键值对存储:HashMap存储的是键值对,其中键必须是唯一的,而值可以重复。
  • 哈希表实现:内部使用哈希表来存储数据,通过键的哈希码来快速定位。
  • 允许null键和null值:HashMap允许一个键为null,并且允许多个值为null。
  • 非线程安全:HashMap不是线程安全的,在多线程环境下,需要使用Collections.synchronizedMap()方法或者使用ConcurrentHashMap来保证线程安全。
  • 无序性:HashMap不保证元素的顺序,特别是它不保证该顺序恒久不变。
因为在本题中涉及到对数组元素的查找,包括元素值和下角标,所以哈希表中要存储两个值,而HashSet只能存储单个数据,数组只能存储少量数据,只有HashMap符合本题特征,故使用。

HashMap的基本使用方法:

创建HashMap对象

使用构造函数创建一个HashMap对象:

Map<String, Integer> map = new HashMap<>();
  • 1
添加元素

使用put(K key, V value)方法向HashMap中添加键值对:

map.put("key1", 1);
map.put("key2", 2);
  • 1
  • 2
获取元素

使用get(Object key)方法根据键获取对应的值:

Integer value = map.get("key1");
System.out.println(value); // 输出 1
  • 1
  • 2
删除元素

使用remove(Object key)方法根据键删除对应的键值对:

map.remove("key1");
  • 1
遍历元素

有多种方式可以遍历HashMap中的元素:

  • 使用keySet()方法遍历键:

    for (String key : map.keySet()) {
        Integer value = map.get(key);
        System.out.println(key + ": " + value);
    }
    
    • 1
    • 2
    • 3
    • 4
  • 使用entrySet()方法遍历键值对:

    for (Map.Entry<String, Integer> entry : map.entrySet()) {
        String key = entry.getKey();
        Integer value = entry.getValue();
        System.out.println(key + ": " + value);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
检查元素是否存在

使用containsKey(Object key)方法检查是否包含某个键:

boolean containsKey = map.containsKey("key1");
System.out.println(containsKey); // 输出 true 或 false
  • 1
  • 2
获取大小

使用size()方法获取HashMap中键值对的数量:

int size = map.size();
System.out.println(size);
  • 1
  • 2
清空HashMap

使用clear()方法清空HashMap中的所有元素:

map.clear();
  • 1
判断HashMap是否为空

使用isEmpty()方法判断HashMap是否为空:

boolean isEmpty = map.isEmpty();
System.out.println(isEmpty); // 输出 true 或 false
  • 1
  • 2

其他常用方法

  • putIfAbsent(K key, V value):如果指定的键尚未与某个值关联,则将其与给定值关联。
  • replace(K key, V value):替换指定键对应的值。
  • getOrDefault(Object key, V defaultValue):获取指定键对应的值,如果键不存在,则返回默认值。

两数之和(题解)

一、题目:

力扣链接

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
  • 1
  • 2
  • 3

示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]
  • 1
  • 2

二、思路:

  • 本题可以用暴力直接双循环写出来,或者就是当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。
  • 此题可以理解为在一个集合中寻找是否存在一个与当前遍历数组元素相加之和等于target的数。
  • 因为本题,我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,需要使用 key value结构来存放,key来存元素,value来存下标,那么使用HashMap正合适。

三、代码实现:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> map1 = new HashMap<>();// 创建HashMap对象
        for(int i = 0; i < nums.length; i ++){// 遍历数组
            if(map1.containsKey(target - nums[i])){// 查找当前的map中是否有满足要求的值
                return new int []{i, map1.get((target - nums[i]))};// 有则返回数组
            }
            else{
                map1.put(nums[i], i);//没有的话,把访问过的元素和下标加入Map中
                // 一定要在第一遍获取HashMap的值之后在往里面添加!
            }
        }
        return null;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

四、注意点:

  • 往HashMap里面添加的时候一定要等第一遍获取值之后再添加,因为如果target=6,nums[i] = 3的话,那么就会把第一个添加的元素3返回两次造成错误。
注:本文转载自blog.csdn.net的学不会java不改命!!!!的文章"https://blog.csdn.net/2402_82473645/article/details/145715582"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

113
数据结构与算法
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top