码迷,mamicode.com
首页 > 编程语言 > 详细

在数组中找几个数的和等于某个数[LeetCode]

时间:2015-08-03 16:43:15      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:

首先明确一点,这个方面的问题设计到的知识点是数组的查找的问题。对于类似的这样的查找操作的具体办法就是三种解决方法:

1.暴力算法,多个for循环,很高的时间复杂度
2.先排序,然后左右夹逼,但是这样会破坏原始数组的下表
3.利用Hash表,直接定位元素,很少的时间复杂度

  

TwoSums

先来看看最简单的,在一个数组中找两个数的和等于某个数。

这个题目最简简单的方法就是暴力法,所需的时间复杂度是O(n2),但是这是不允许的,所以一个O(n)的方法就是利用Hash表存储数据,这样能够把查找的时间降低下来。使用到的工具就是unordered_map。在这个hash表中,key是数组的数字本身,value是数组数字的下标值。这样只需要把原数组扫描一遍,对于每一个数组中的值,求target与数组元素的差值,然后把这个差值作为key到hash表中找对应的value。

但是注意这样的值:

3   2   4  target=6

这样会产生三组值满足:(3,3)(2,4)(4,2)所以要规定一下:第二个通过hash得到的下标值一定要比第一个下标值大才可以。

vector<int> twoSum(vector<int>& nums, int target) 
{
	unordered_map<int, int> mapping;
	vector<int> result;

	for(int i = 0; i < nums.size(); i++)
	{
		mapping[nums[i]] = i;
	}

	for(int i = 0; i < nums.size(); i++)
	{
		const int gap = target - nums[i];

		if(mapping.find(gap) != mapping.end() && mapping[gap] > i)
		{
			result.push_back(i + 1);
			result.push_back(mapping[gap] + 1);
		}
	}

	return result;
}

  find函数,在找到的时候会返回一个指向该元素的iterator,如果没有找到会返回一个end。如果找到了,可以通过operator[]来访问这个元素。

 

在数组中找几个数的和等于某个数[LeetCode]

标签:

原文地址:http://www.cnblogs.com/stemon/p/4699512.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!