leetcode1

前言:

研一了,提前刷刷leetcode,为以后找工作打基础。


题意:

在数组中找出两个数相加为target,并返回这两个数的索引

要求:

1.索引小的在前

2.找出一组即可


思路1,最早想到的肯定是2重循环搜索,提交后超时,这里也贴出代码:

class Solution{
public:
	Solution(){}
	vector<int> twoSum(vector<int>& nums, int target){
		//alg1
		//brute force: Time Limit Exceeded
		vector<int> ret;
		if(nums.size()<=1)
			return ret;
		vector<int>::iterator it1;
		vector<int>::iterator it2;
		for(it1=nums.begin();it1!=nums.end()-1;it1++)
		{
			for(it2=it1+1;it2!=nums.end();it2++)
			{
				if(*it1 + *it2 == target)
				{
					ret.push_back(it1-nums.begin()+1);
					ret.push_back(it2-nums.begin()+1);
					return ret;
				}
			}
		}
	}
};


思路2,降低时间复杂度最直接的方法就是牺牲空间,这里用map来事先存储key-value分别为{number,indexOfNumber}。

在数组中遍历x1,那么如果x1+x2=target,且x2在数组中,则target-x1在数组中,那么在一重循环中,依次判断key为target-x1

是否存在,存在即返回index,此时x1的index也可以通过map求出。

这个时候只需要调整一下index的大小关系即可。

代码:

class Solution{
private:
	void swap(int &index1,int&index2)
	{
		int temp;
		temp=index1;
		index1=index2;
		index2=temp;
	}
public:
	//Solution(){}
	vector<int> twoSum(vector<int>& nums, int target)
	{
		map<int,int> myMap;
		vector<int>result;
		int index1;
		int index2;
		for(int i= 0;i<nums.size();i++)
		{
			myMap.insert(pair<int,int>(nums[i],i));
		}
		vector<int>::iterator it;
		for(it=nums.begin();it!=nums.end();it++)
		{
			int number = target - *it;
			if(myMap.find(number)!=myMap.end())
			{
				index1=it-nums.begin()+1;
				index2=myMap.find(number)->second + 1;
				if(index1>index2)
				{
					swap(index1,index2);
				}
				else if(index1 == index2)
				{
					continue;
				}
				result.push_back(index1);
				result.push_back(index2);
				return result;
			}
		}
		return result;
	}
};

附:

由于leetcode都是提交class,测试用的main函数需要自己编写:

int main()
{
	
	Solution sol;
	vector<int>nums;
	nums.push_back(3);
	nums.push_back(2);
	nums.push_back(4);
//	nums.push_back(15);
	int target = 6;
	vector<int>result=sol.twoSum(nums,target);
	vector<int>::iterator it;
	for(it=result.begin();it!=result.end();it++)
	{
		cout<<*it<<" ";
	}
	cout<<endl;
	
	return 0;
}

后记:

以后会慢慢把leetcode做完,可能会很慢,但是会坚持:

i walk slowly,but never back up

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值