leetcode每日一道(第一道)

1、Two Sum 两数之和

案例:

Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2

  • 7 = 9, return [0, 1]

思路:
使用一个HashMap,来建立数字和其坐标位置之间的映射,我们都知道HashMap是常数级的查找效率,这样,我们在遍历数组的时候,用target减去遍历到的数字,就是另一个需要的数字了,直接在HashMap中查找其是否存在即可,注意要判断查找到的数字不是第一个数字,比如target是4,遍历到了一个2,那么另外一个2不能是之前那个2,整个实现步骤为:先遍历一遍数组,建立HashMap映射,然后再遍历一遍,开始查找,找到则记录index。

#include <iostream>
#include <string.h>
#include <map>
#include <vector>
using namespace std;

class Solution 
{
public:
	vector<int> twoSum(vector<int>&nums, int target)

	{
		map<int, int> m;
		vector<int> res;
		for (int i = 0; i < nums.size(); ++i) 
		{
			m[nums[i]] = i;   //key 为数组的值
		}
		for (int i = 0; i < nums.size(); ++i) 
		{
			int t = target - nums[i];//
			if (m.count(t) && m[t] != i) //差如果在Map里面说明找到了,把下标放到vector里面就OK了
			{
				res.push_back(i);
				res.push_back(m[t]);
				break;
			}
		}
		return res;
	}
	
};

int main()
{

	vector<int>vec;
	vec.push_back(10);
	vec.push_back(70);
	vec.push_back(2);
	vec.push_back(5);
	vec.push_back(11);
	vec.push_back(6);
	Solution s;
	vector<int> vec1 = s.twoSum(vec,76);
	for(vector<int>::iterator it = vec1.begin();it !=vec1.end();it++)
	{
		cout<<*it<<endl;
	}




	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_35433716/article/details/89461873