LeetCode 1. Two Sum
一.题目分析
1.要点:
- each input would have exactly one solution
- not use the same element twice
2.散列
定义:将元素通过一个函数转换为整型,使该整数可以尽量唯一的代表该元素
例如:
m[nums[i]] = i;//可以体现散列的思想,用空间换时间
散列为什么能够加快查找速度呢? ?
假如:你去超市买4号物品,首先需要找到1号物品的位置,如果超市中的货物不存在存放表,那么当你需要寻找一样物品就需要遍历这个仓库。但如果超市中存在如下的货物存放表(相当于本题中的HashMap),那么你就可以在常数时间复杂度内找到你所要物品的位置。
1 二楼四号口
2 三楼四号口
3 一楼三号口
… …
3.解题思路
- 暴力搜索:遍历所有的两个数字的组合,然后算其和,时间复杂度为O(N^2)
- 快速排序:先使用快速排序,时间复杂度为O(n*logn),再分别在数组头尾设置两个标记,每次比较头尾两个数的和,如果比target小,头标记右移,如果大,尾标记左移。但需要注意记录快速排序前后数字的位置变化。
- HaspMap: 想用线性时间复杂度来解决问题,也就是说只遍历一个数字,而将另一个数字存储起来,使用一个HashMap来建立数字与其坐标位置之间的映射,而HashMap是常数级别的查找效率。故在遍历数组的时候,用target减去遍历得到的数字,就是另一个需要的数字,直接在HashMap中查找需要的数字即可。
二.相关代码
1.Python版本
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
numMap = {} #创建了一个空字典而并非空set numMap = set()
# for i in range(0,len(nums)):
# if target - nums[i] in numMap:
# return [ i , numMap[target - nums[i]]]
# else:
# numMap[nums[i]] = i
# another version 利用pthon 内置enumerate函数,速度更快
for i,item in enumerate(nums):
complement = target - item
if complement in numMap:
return [i , numMap[complement]]
else:
numMap[item] = i
enumerate( )函数介绍
- 作用对象:可遍历的数据对象(如列表、元组或字符串)
- 作用:将数据对象组合为一个索引序列,同时列出数据下标和数据
#普通for 循环
i = 0
seq = ['one','two']
for element in seq:
print(i,seq[i])
i += 1
#for 循环使用enumerate
seq = ['one','two']
for i,item enumerate(seq):
print(i,item)
#summary: 从中可看出,item表示的是数据,而不用再通过数据小标得到数据
2.C++ 版本
class Solution
{
public:
vector<int> twoSum(vector<int> &nums, int target)
{
vector<int> res;
unordered_map<int, int> m;
//以要查找的数作为数组的下标来建立映射表
for (int i = 0; i < nums.size(); i++)
{
int needed = target - nums[i];
if (m.count(needed) && m[needed] != i)
{
res.push_back(i);
res.push_back(m[needed]);
break ;
}
else
{
m[nums[i]] = i;
}
}
return res;
}
};
LeetCode TwoSum题解
本文深入解析LeetCode经典题目TwoSum,探讨了暴力搜索、快速排序及HashMap三种解题策略,重点介绍了如何运用HashMap实现线性时间复杂度的解决方案,以提升查找效率。
245

被折叠的 条评论
为什么被折叠?



