描述:
给出一个整数数组,请在数组中找出两个加起来等于目标值的数,
你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足 index1 小于index2.。注意:下标是从1开始的
假设给出的数组中只存在唯一解
例如:
给出的数组为 {20, 70, 110, 150},目标值为90
输出 index1=1, index2=2
示例1
输入:
[3,2,4],6
复制
返回值:
[2,3]
(题目来自牛客网)
用C++实现如下
class Solution {
public:
/**
*
* @param numbers int整型vector
* @param target int整型
* @return int整型vector
*/
vector<int> twoSum(vector<int>& numbers, int target) {
//方法1,暴力遍历法
// vector<int> results = {0,0};
// for(int i=0; i<numbers.size()-1; i++) //和排序算法的选择法类似,暴力遍历
// {
// for(int j=i+1; j<numbers.size(); j++)
// {
// if(numbers[i]+numbers[j]==target)
// {
// results[0] = i+1; //返回的是下标值的index,注意和i的区别
// results[1] = j+1;
// return results;
// }
// }
// }
// throw invalid_argument("no two sum solution"); //没有结果则抛异常
//方法2,hash table,快速地映射数据和它的下标
vector<int> results = {0,0};
map<int, int> hashtable; //定义一个hashtable的map
//完成hashtable的填充(值,index)
for(int i=0;i<numbers.size();i++) //遍历所有元素生成hashtable
{
hashtable[numbers[i]]=i; //定义hashtable,分别为"值,index"
}
for(int i =0; i<numbers.size(); i++)
{
int temp = target - numbers[i]; //求出需要找到的对应值
//注意hashtable.count(目标值)和hashtable.at(目标值的index)的使用
if(hashtable.count(temp) != 0 && hashtable.at(temp) != i) //找到了(temp对应的count
{ //不为0),而且temp对应的不是本身
results = {i+1, hashtable.at(temp)+1}; //找到了,对result进行赋值
return results;
}
}
throw invalid_argument("No two sum solution"); //异常情况,需要抛异常
}
};
纯手撕代码,如果觉得内容不错麻烦点个赞,后面陆续配上Top100算法题通俗易懂的讲解视频,可以花两个月时间完全掌握,进大厂不是梦,转行狗亲测!