题目描述
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 :
输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
一、JAVA解法
class Solution {
public int[] twoSum(int[] nums, int target){
Map<Integer,Integer> map = new HashMap<>();
for(int i = 0, j = nums.length - 1;i<=j;i++,j--){
if(map.containsKey(target - nums[i])){
return new int[]{map.get(target - nums[i]),i};
}else{
map.put(nums[i],i);
}
if(map.containsKey(target - nums[j])){
return new int[]{map.get(target - nums[j]),j};
}else{
map.put(nums[j],j);
}
}
return new int[2];
}
}
二、JAVA复盘
1.双指针法。两头遍历。
*注意对于0-indexed列表,最后一项索引是nums.length - 1.(右指针)左右指针的移动是同时的。
2.利用哈希表-键值对的数据结构存储列表索引和内容。
哈希表是一个性能良好的,针对列表进行观察的第二空间。在各种关于列表的问题中,我们可以用哈希表作为第二空间对某个列表进行遍历--->对各项进行条件判断--->返回/ 存储特定的数据。
例如在本题中,将符合条件(对于每个i,map里存在对应的number,使得i+number == target。*number = target - nums[i])的数据返回,将不符合条件的数据全都存储在哈希表里,等待后续的检索。由于两头便利,实际上, 二分之nums.length就把列表nums给遍历完了。
其精髓在于,每一次都把列表的数据拿出来放到map里,并在map里检索是否有符合条件的值,返回值的对应索引——聪明地运用了map“键值对”独特的数据结构。
3.让我们重温哈希表的基本语法:
①创建新的哈希表
HashMap<KeyType, ValueType> hashMap = new HashMap<>();
②插入键值对-用 .put(键,值)
hashMap.put(key, value);
③获取值- 用.get(值的对应键)
ValueType value = hashMap.get(key);
④检查键是否存在-用.containsKey(键)
boolean containsKey = hashMap.containsKey(key);
⑤删除键值对-用.containsKey(键)
boolean containsKey = hashMap.containsKey(key);
三、Python解法
class Solution(object):
def twoSum(self, nums, target):
# 创建一个空的哈希表
hashmap = {}
# 遍历数组,同时获取索引和元素值
for i, num in enumerate(nums):
# 计算当前元素与目标值的差值
complement = target - num
# 检查差值是否在哈希表中
if complement in hashmap:
# 如果在,返回差值的索引和当前元素的索引
return [hashmap[complement], i]
# 如果差值不在哈希表中,则将当前元素及其索引添加到哈希表中
hashmap[num] = i
四、Python复盘
1.复习哈希表基础语法
①创建哈希表-python用大括号{}
hash_table = {} # 创建一个空的哈希表
②添加键值对-用键赋值
hash_table[key] = value # 添加键值对到哈希表中
③获取值-用键调取值,赋给一个变量
value = hash_table[key] # 根据键获取对应的值
④判断键是否存在-if判断
if key in hash_table: # 键存在于哈希表中 else: # 键不存在于哈希表中
⑤删除键值对-del
del hash_table[key] # 删除指定键值对
⑥遍历哈希表-for循环
for key in hash_table: value = hash_table[key] # 获取键对应的值 # 对每个键值对执行操作
2. self是谁
在 Python 中,实例对象是类的一个具体实例,也就是类的一个具体的对象。在这段代码中,实例对象是 Solution
类的一个实例,它代表了解决问题的实体。
3. enumerate 枚举函数
enumerate()
函数是 Python 内置函数,用于将一个可迭代对象转换为一个枚举对象,同时返回元素的索引和值。它的语法结构如下:
enumerate(iterable, start = 0)
iterable
:需要枚举的可迭代对象,例如列表、元组、字符串等。start
:可选参数,表示索引起始值,默认为 0。
enumerate()
函数返回一个迭代器对象——该迭代器产生由索引和元素组成的元组。其中,索引是从 start
开始递增的整数,元素是可迭代对象中的元素。在循环迭代时,可以同时获取元素的索引和值。
本题里,在代码中的这一行中:
for i, num in enumerate(nums):
enumerate(nums)
将整数数组 nums
转换为一个枚举对象,然后在每次迭代时,返回一个包含索引 i
和元素值 num
的元组。
五、C++解法
#include <vector>
#include <map>
using namespace std;
class Solution
{
public:
vector<int> twoSum(vector<int> &nums, int target)
{
map<int, int> hx;
for (int i = 0; i < nums.size(); i++)
{
auto it = hx.find(target - nums[i]);
if (it != hx.end())
return {i, it->second};
hx[nums[i]] = i;
}
return {};
}
};
六、C++复盘
1.vector<int> 向量:动态列表
2.auto 自判断的数据类型
3.it 迭代器,判断是否走到哈希表末尾
其实也是用哈希表存储和判断,但是用的是迭代器,方便一些。
七、思路与问题
到底是谁决定了时间复杂度低?遍历谁?-遍历列表nums
利用迭代器遍历。-什么是迭代器?
如何想到默认把不符合条件的数据存入哈希表,并在哈希表里查找符合条件的键值对?