LeetCode 1
本文最后更新于:2021年9月8日 晚上
LeetCode 1
概述
- https://leetcode-cn.com/problems/two-sum/
- 给定一个整数数组和一个target,从数组中选择两个相加等于target的值,返回选择的两个的数组下标
- 同一个元素不能被重复选,且只会有一个结果
思路
-
返回下标,说明不能排序,那么不能使用多指针法;
-
题目只是要求,同一个元素不能被重复选,并没有说最终结果中不能有重复的元素,所以可以使用哈希法或
find()
函数1
2
3
4
5
6
7
8
9
10
11
12//方法一 find()函数找,时间复杂度高
vector<int> twoSum(vector<int>& nums, int target) {
for(int i=0;i<nums.size();i++){
int temp=target-nums[i];
auto index=find(nums.begin(),nums.end(),temp);
int t=index-nums.begin();
if(index!=nums.end()&&t!=i){ //确保不是同一元素
return {i,t};
}
}
return {0,0};
}1
2
3
4
5
6
7
8
9
10
11
12
13
14//方法二 哈希法
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> mp;
for(int i=0;i<nums.size();i++){
mp[nums[i]]=i+1; //记录索引,这题题目明确说 只有一个答案才可以这样做的
}
for(int i=0;i<nums.size();i++){
int temp=mp[target-nums[i]];
if(temp!=0&&temp-1!=i){ /
return {i,temp-1};
}
}
return {};
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16/*官方题解 哈希
注意和自己的方法二的不同,方法二是针对此题明确一个答案才可以那样。
因为法二在记录索引是,相同的nums[i]的值会被覆盖,之会存在一个索引。
但是,因为只有一个答案,所以如果有相同的值,那么要么是用不到的,要么一定是两个相同值就是最终的答案;否则不可能只有一个解
*/
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> hashtable;
for (int i = 0; i < nums.size(); ++i) {
auto it = hashtable.find(target - nums[i]);
if (it != hashtable.end()) {
return {it->second, i};
}
hashtable[nums[i]] = i;
}
return {};
}
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!