0
点赞
收藏
分享

微信扫一扫

[数组]BM50 两数之和-简单

何以至千里 2022-06-20 阅读 53

​​BM50 两数之和​​

知识点​​数组​​​​哈希​​

描述

给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列。(注:返回的数组下标从1开始算起,保证target一定可以由数组里面2个数字相加得到)

数据范围:[数组]BM50 两数之和-简单_hash表[数组]BM50 两数之和-简单_数组_02[数组]BM50 两数之和-简单_hash表_03要求:空间复杂度 [数组]BM50 两数之和-简单_数组_04,时间复杂度 [数组]BM50 两数之和-简单_数组_05

示例1

输入:

[3,2,4],6

复制返回值:

[2,3]

复制说明:

因为 2+4=6 ,而 2的下标为2 , 4的下标为3 ,又因为 下标2 < 下标3 ,所以返回[2,3]

示例2

输入:

[20,70,110,150],90

复制返回值:

[1,2]

复制说明:

20+70=90

题解

遍历整个数组,用一个hash表存放数组的值和索引,当目标值和当前值之差在hash表中时,表示已经找到了这两个值,否则将当前值和其索引放入hash表中。

注意:std::unordered_map换成std::map,那么时间复杂度会增加。前者索引时间复杂度为O(1),后者为log(n)。这里不需要有序,std::unordered_map就可以满足需求。

如果这里将

代码如下:

#include <bits/stdc++.h>

using namespace std;

vector<int> twoSum(vector<int> &numbers, int target)
{
std::unordered_map<int, int> m;
m[numbers[0]] = 0;
std::vector<int> ans;
for (int i = 1; i < numbers.size(); ++i)
{
int val = target - numbers[i];
if (m.find(val) != m.end())
{
ans.push_back(m[val] + 1);
ans.push_back(i + 1);
break;
}
if (m.find(numbers[i]) == m.end())
{
m[numbers[i]] = i;
}
}
return ans;
}
举报

相关推荐

0 条评论