leetcode:两数之和 ??

题目:

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。例如:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

链接:https://leetcode-cn.com/problems/two-sum/description/

思路:

1. 穷举法,时间复杂度O(n^2)

2. 我的解法,设置头尾两个指针,首先对数组排序,然后让一个指针i指向第一个数,一个j指向最后一个数,如果两个位置的数之和正好等于target,保存下这两个数字直接返回,如果之和小于target,i++,如果之和大于target,j--。无法通过,因为只能返回符合条件的两个数字,或者其在排序数组中的下标,无法返回其在原数组中的下标。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
	vector<int> result;
	if(nums.empty()||nums.size()<2)
		return result;
	sort(nums.begin(),nums.end());
	int i=0;
        int j=nums.size()-1;
	while(i<j)
	{
		if(nums[i]+nums[j]==target)
		{
			result.push_back(nums[i]);
			result.push_back(nums[j]);
			return result;
		}
		else if(nums[i]+nums[j]<target)
			i++;
		else
			j--;
         }
	return result;//不存在这样的两个数,返回空
    }
};

是否可以先遍历一遍数组,建立一个hash映射,这样就可以在原数组中由数字找到下标?

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
	vector<int> result;
	if(nums.empty()||nums.size()<2)
		return result;
	unordered_map<int,int> map;
	for(int k=0;k<nums.size();k++)
	{
		map[nums[k]]=k;
	} 
	sort(nums.begin(),nums.end());
	int i=0;
        int j=nums.size()-1;
	while(i<j)
	{
		if(nums[i]+nums[j]==target)
		{
			result.push_back(map[nums[i]]);
			result.push_back(map[nums[j]]);
			return result;
		}
		else if(nums[i]+nums[j]<target)
			i++;
		else
			j--;
         }
	return result;
    }
};

还是无法通过,当数组为[3, 3],target=6时,本来应该返回[0,1],结果返回[1,1]了。unordered_map不允许有重复的key。

但是为啥下面的就可以通过呢?

2. 网上找到的解法

还是先遍历数组,将数字和下标存储为hash map,然后再遍历数组,如果存在target-nums[i]的数字(map.count!=0),并且这个数字的下标不是i(数字不能重复利用),说明找到了这样的两个数,下标分别为i和map[target-nums[i]]。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
	vector<int> result;
	if(nums.empty()||nums.size()<2)
		return result;
	unordered_map<int,int> map;
	for(int k=0;k<nums.size();k++)
	{
		map[nums[k]]=k;
	} 
	for(int i=0;i<nums.size();i++)
	{
		int num=target-nums[i];
                if(map.count(num)&&map[num]!=i)
		{
			result.push_back(i);
			result.push_back(map[num]);
			return result;
		}
	}
	return result;
    }
};

猜你喜欢

转载自blog.csdn.net/u012991043/article/details/81285983