在一个数组中找出两个数,这两个数之和为指定目标值,返回这两个数下标(leecode)(c++)

本文主要总结在一个数组中取出两个数,这两个数满足条件为:两数之和为制定目标值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;
}

在一个数组中找出两个数,这两个数之和为指定目标值,返回这两个数下标(leecode)(c++)_第1张图片

1.2.2二遍哈希表解法(12ms,10.8MB)

#include 
#include 
#include 
#include 

using namespace std;

//从一个数组中任意取出两个数,这两个数之和为target
vector twoSum(vector& nums, int target)
{
	vector result;
	
	map hashMap;
	for (int i = 0; i < nums.size(); ++i)
	{
		hashMap.insert(pair(nums.at(i), i));
	}
	for (int i = 0; i < nums.size(); ++i)
	{
		auto it = hashMap.find(target - nums.at(i)); //没找到,位置返回end; map::count(9),找到返回1,否则返回0
		if (it!=hashMap.end() && i!=it->second)
		{
			result.push_back(i);
			result.push_back(it->second);
			break;
		}
	}
	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;
}

在一个数组中找出两个数,这两个数之和为指定目标值,返回这两个数下标(leecode)(c++)_第2张图片

1.2.3一遍哈希表法(16ms,10.3MB)

#include 
#include 
#include 
#include 

using namespace std;

//从一个数组中任意取出两个数,这两个数之和为target
vector twoSum(vector& nums, int target)
{
	vector result;
	
	map hashMap;
	for (int i = 0; i < nums.size(); ++i)
	{
		if (hashMap.count(target - nums[i]))
		{
			result.push_back(hashMap[target - nums[i]]);
			result.push_back(i);
			break;
		}
		hashMap.insert(pair(nums[i], i));
	}
	
	return result;
}

int main() 
{		
	vector result, nums = {5,6,7,8,9,10};
	int target = 18;
	result = twoSum(nums, target);
	for (auto iter = result.begin(); iter != result.end(); iter++)
		cout << *iter << endl;
	
	system("pause");

	return 0;
}

在一个数组中找出两个数,这两个数之和为指定目标值,返回这两个数下标(leecode)(c++)_第3张图片

1.3总结

由上面的三个程序运行结果对比可知,哈希表的运行时间远远小于暴力解法,大约为38倍(464/12==38.667)速度,但是消耗的内存也比暴力破解法多不少。

 

 

参考内容:

https://leetcode-cn.com/problems/two-sum/(参考:两数之和)

你可能感兴趣的:(数据结构与算法)