本着提升技能,并为蓝桥杯做准备的想法,题解语言采用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 查找的基本过程:
-
当向 HashMap 中添加键值对时,系统会首先使用哈希函数计算键的哈希码(hash code)。
-
哈希码是一个整数,它代表了键在哈希表中的理想存储位置。
-
使用哈希码作为索引,HashMap 将键值对存储在对应的位置上。如果多个键具有相同的哈希码,它们可能会被存储在同一个位置上,这就形成了所谓的哈希冲突。
-
当需要查找某个键对应的值时,HashMap 会再次计算键的哈希码。
-
使用哈希码作为索引,HashMap 将在相应位置上查找对应的值。
-
如果存在哈希冲突,也就是多个键具有相同的哈希码,HashMap 会使用一些额外的数据结构(例如链表或红黑树)来存储这些键值对,然后在这个数据结构中进行查找。)
通过使用哈希查找,HashMap 能够在大多数情况下以非常高效的方式查找键值对。然而,在极端情况下,例如哈希冲突非常频繁的情况下,性能可能会下降,因此在设计 HashMap 时需要考虑哈希函数的选择和冲突解决策略。
重点,哈希查找的时间复杂度为O(1);
下面是HashMap的简单使用:
HashMap 是一种常用的数据结构,它提供了许多常用的函数和方法,用于操作和管理键值对数据。以下是一些 HashMap 的常用函数和方法:
-
put(key, value)
:向 HashMap 中添加一个键值对,如果键已存在,则替换其对应的值。 -
get(key)
:根据键查找对应的值。如果键不存在,则返回 null。 -
remove(key)
:根据键删除对应的键值对。 -
containsKey(key)
:检查 HashMap 中是否包含指定的键。返回 true 表示存在,返回 false 表示不存在。 -
containsValue(value)
:检查 HashMap 中是否包含指定的值。返回 true 表示存在,返回 false 表示不存在。 -
size()
:返回 HashMap 中键值对的数量。 -
isEmpty()
:检查 HashMap 是否为空。如果没有任何键值对,返回 true,否则返回 false。 -
keySet()
:返回包含所有键的 Set 集合。 -
values()
:返回包含所有值的集合。 -
entrySet()
:返回包含所有键值对的 Set 集合。 -
clear()
:清空 HashMap,删除所有键值对。 -
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);
}
}