LetCode之热题100.1——哈希(两数之和)

本着提升技能,并为蓝桥杯做准备的想法,题解语言采用java,编码环境使用eclipse。

更加建议大家读懂算法思想,而不是单纯的copy代码




 

一、题目描述

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

二、题目输入

示例 1:

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

示例 2:

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

示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

提示:

  • 2 <= nums.length <= 104
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109
  • 只会存在一个有效答案
三、题目思路

1.首先最简单的,暴力求解,挨个循环,时间复杂度为O(n2),正常应该都会,不再赘述;

2.哈希求解。首先我们来了解一下Hashmap这个东西:

HashMap(哈希映射)是一种常见的数据结构,它用于存储键值对(key-value pairs)并提供快速的数据访问。它通过将键(key)映射到值(value)的方式来存储数据,这样可以根据键来快速查找相应的值,而无需遍历整个数据集。

  无需遍历整个数据集!!!

(下面是 HashMap 查找的基本过程:

  1. 当向 HashMap 中添加键值对时,系统会首先使用哈希函数计算键的哈希码(hash code)。

  2. 哈希码是一个整数,它代表了键在哈希表中的理想存储位置。

  3. 使用哈希码作为索引,HashMap 将键值对存储在对应的位置上。如果多个键具有相同的哈希码,它们可能会被存储在同一个位置上,这就形成了所谓的哈希冲突。

  4. 当需要查找某个键对应的值时,HashMap 会再次计算键的哈希码。

  5. 使用哈希码作为索引,HashMap 将在相应位置上查找对应的值。

  6. 如果存在哈希冲突,也就是多个键具有相同的哈希码,HashMap 会使用一些额外的数据结构(例如链表或红黑树)来存储这些键值对,然后在这个数据结构中进行查找。)

通过使用哈希查找,HashMap 能够在大多数情况下以非常高效的方式查找键值对。然而,在极端情况下,例如哈希冲突非常频繁的情况下,性能可能会下降,因此在设计 HashMap 时需要考虑哈希函数的选择和冲突解决策略。

重点,哈希查找的时间复杂度为O(1);

下面是HashMap的简单使用:

HashMap 是一种常用的数据结构,它提供了许多常用的函数和方法,用于操作和管理键值对数据。以下是一些 HashMap 的常用函数和方法:

  1. put(key, value):向 HashMap 中添加一个键值对,如果键已存在,则替换其对应的值。

  2. get(key):根据键查找对应的值。如果键不存在,则返回 null。

  3. remove(key):根据键删除对应的键值对。

  4. containsKey(key):检查 HashMap 中是否包含指定的键。返回 true 表示存在,返回 false 表示不存在。

  5. containsValue(value):检查 HashMap 中是否包含指定的值。返回 true 表示存在,返回 false 表示不存在。

  6. size():返回 HashMap 中键值对的数量。

  7. isEmpty():检查 HashMap 是否为空。如果没有任何键值对,返回 true,否则返回 false。

  8. keySet():返回包含所有键的 Set 集合。

  9. values():返回包含所有值的集合。

  10. entrySet():返回包含所有键值对的 Set 集合。

  11. clear():清空 HashMap,删除所有键值对。

  12. putAll(map):将另一个 Map 中的所有键值对添加到当前 HashMap 中。

所以,对于此题,我们只需遍历整个数组,首先查找HashMap中是否有自己想要的Value值,如果有则结束循环,如果没有,则将该数加入HashMash,即可。

四、题解
class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();
        for(int i = 0; i< nums.length; i++) {
            if(map.containsKey(target - nums[i])) {
                return new int[] {map.get(target-nums[i]),i};
            }
            map.put(nums[i], i);
        }
        throw new IllegalArgumentException("没有两数和为:"+target);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mu Haitian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值