leetcode算法练习——两数之和

题目:

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

分析:
暴力法两层循环,时间复杂度是 n 2 n^{2} ,所以不考虑。
一开始的思路是用map来存放数组的元素(key)和对应位置(values),但map容器不能存放相同的key,对数组中有相同元素的情况只能加入最先出现的那个,所以用multimap代替map,它与map的区别是可以存放相同的key。map/multimap中的元素都是按key有序存放的,所以在multimap中相同的key一定会相邻。

注:这是为了解决 t a r g e t = 2 x target=2{x} ,且在数组中有两个 x x 的情况。

用find函数来定位数据出现位置,它返回一个迭代器,当数据出现时,它返回数据所在位置的迭代器。如果map/multimap中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器。

代码如下:

class Solution 
{public:    
	vector<int> twoSum(vector<int>& nums, int target)     
	{       
		vector<int> result;        
		int length = nums.size();
		multimap<int,int> temp; 
		for (int i=0;i < length;i++)
		{
			temp.insert(make_pair(nums[i],i));        
		}        
		for (int j=0;j < length;j++)        
		{            
			int fir = target - nums[j];            
			int time = temp.count(nums[j]);            
			if (fir != nums[j] && temp.count(fir) != 0)            
			{                
				result.push_back(j);                
				multimap<int, int>::iterator findit = temp.find(fir);                
				if (findit != temp.end())                
				{                    
				result.push_back(findit->second);                
				}                
				break;            
			}            
			else if (fir == nums[j] && time == 2)            
			{                
				multimap<int,int>::iterator beg = temp.find(fir);                
				if (beg != temp.end())                
				{                    
					for (int k=0;k!=2; k++ , beg++)#相同key相邻,向后移动即可
					{                        
					result.push_back(beg->second);                    
					}
                
				}
				break;                            
			}        
		}        
	return result;    
	}
};

执行结果:

在这里插入图片描述

测试用例:

在这里插入图片描述
在这里插入图片描述

发布了102 篇原创文章 · 获赞 6 · 访问量 2048

猜你喜欢

转载自blog.csdn.net/qq_44957388/article/details/104585878