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);
    }
}
相关推荐
ZSYP-S32 分钟前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
yuanbenshidiaos39 分钟前
C++----------函数的调用机制
java·c++·算法
唐叔在学习43 分钟前
【唐叔学算法】第21天:超越比较-计数排序、桶排序与基数排序的Java实践及性能剖析
数据结构·算法·排序算法
ALISHENGYA1 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(switch语句)
数据结构·算法
chengooooooo1 小时前
代码随想录训练营第二十七天| 贪心理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和
算法·leetcode·职场和发展
jackiendsc1 小时前
Java的垃圾回收机制介绍、工作原理、算法及分析调优
java·开发语言·算法
游是水里的游2 小时前
【算法day20】回溯:子集与全排列问题
算法
yoyobravery2 小时前
c语言大一期末复习
c语言·开发语言·算法
Jiude2 小时前
算法题题解记录——双变量问题的 “枚举右,维护左”
python·算法·面试
被AI抢饭碗的人3 小时前
算法题(13):异或变换
算法