本文主要总结在一个数组中取出两个数,这两个数满足条件为:两数之和为制定目标值target,并且函数返回这两个数下表。
示例:
给定 nums = [5,6,7,8,9,10], target = 19
因为 nums[4] + nums[5] = 9 + 10 = 19
所以返回 [4, 5]
1.1解题思路
根据题意,可以看出这是一个组合问题,也就是高中数学常见的排列组合基本问题。
这题有两种常见的解法。第一种为暴力解法,也就是穷举法;第二种用哈希表。下面将分别示例两种解法代码
.1.2示例代码
1.2.1暴力解法(464ms,9.4MB)
#include
#include
using namespace std;
//从一个数组中任意取出两个数,这两个数之和为target
vector twoSum(vector& nums, int target)
{
vector result;
for (int i = 0; i < nums.size()-1; ++i) //穷举法
{
for (int j = i + 1; j < nums.size(); ++j)
{
if (target == (nums.at(i) + nums.at(j)))
{
result.push_back(i);
result.push_back(j);
}
}
}
return result;
}
int main()
{
vector result, nums = {5,6,7,8,9,10};
int target = 13;
result = twoSum(nums, target);
for (auto iter = result.begin(); iter != result.end(); iter++)
cout << *iter << endl;
system("pause");
return 0;
}
1.2.2二遍哈希表解法(12ms,10.8MB)
#include
#include
#include
1.2.3一遍哈希表法(16ms,10.3MB)
#include
#include
#include
1.3总结
由上面的三个程序运行结果对比可知,哈希表的运行时间远远小于暴力解法,大约为38倍(464/12==38.667)速度,但是消耗的内存也比暴力破解法多不少。
参考内容:
https://leetcode-cn.com/problems/two-sum/(参考:两数之和)