题目如下:
解题思路:
1、一遍遍历,利用hash表。从头遍历数组,对每个数组首先检索当前数组值对应在hash表中是否已经具有满足条件的值:如果有,则返回当前数组值与hash表中对应值的数组下标值;否则将当前数组元素及其下标加入hash表,继续遍历。
代码如下(C++):
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target)
{
int size = nums.size();
map<int,int> mapnums; //声明hash表,以数组元素作为key,数组下标作为value
for(int i = 0; i < size; i++)
{
if(mapnums.count(target - nums[i]) > 0) //当hash表中(target-nums[i])出现的次数不为0
return vector<int>({mapnums[target - nums[i]], i});
else
mapnums[nums[i]] = i;
}
return vector<int>({});
}
};
2、如果该题目要求变为需要返回的是数组元素,可以先使用sort()函数排序后,从数组两端向中间遍历:当前后相加小与target时,前指针索引值增加;当前后相加大于target是,后指针索引值减少,直到找到相加等于target的值并返回;否则返回空数组。
代码如下(C++):
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target)
{
int size = nums.size();
sort(nums.begin(),nums.end());
for(int i = 0,j = size - 1; i < j; )
{
if(nums[i] + nums[j] == target)
return vector<int>({i,j});
else if(nums[i] + nums[j] < target)
i++;
else
j--;
}
return vector<int>({});
}
};
完整代码实现数组两数之和
1、leetcode本身只用实现Solution类即可,而想要自实现完整的函数功能,代码实现如下。
代码如下(C++):
#include <iostream>
#include <vector>
#include <map>
using namespace std;
class Solution{
public:
vector<int> TwoSum(vector<int> &nums, int target){
int nums_size = nums.size();
vector<int> sss;
map<int, int> nums_map; //定义哈希表
nums_map[nums[0]] = 0;
for(int i = 1; i < nums_size; i++){
if(nums_map.count(target - nums[i]) > 0){ //查找哈希表中元素,当找到返回数组下标
//return vector<int>({nums_map[target - nums[i]], i});
sss.push_back(nums_map[target - nums[i]]);
sss.push_back(i);
return sss;
}
else //未找到,将当前值放入哈希表
nums_map[nums[i]] = i;
}
//return vector<int>({});
return sss;
}
};
int main()
{
Solution big;
int flag, t;
int temp;
vector<int> a;
//输入数组大小
cout << "please input the size of array:" << endl;
cin >> flag;
//输入数组元素
cout << "please input array elements: " << endl;
for(int i=0; i < flag; i++)
{
cin >> temp;
a.push_back(temp);
}
//输入目标值
cout << "please input target :" << endl;
cin >> t;
vector<int> b = big.TwoSum(a, t);
if(b.size() != 0) //判断是否找到
cout << "[" << b[0] << "," << b[1] << "]" << endl;
else
cout << "No match" << endl;
}
测试结果如下: