LeetCode-从vector到map——在序列中寻找复合条件的组合

这两天由于在忙其他事情,编程这边效率不是很高,学习进度受限。今天主要是总结下连续两个在算法上比较简单的问题——也就是说,难在实现上。
两个问题可以合并,简单来讲就是在一个有序序列中寻找2个或者3个(当然也可以扩展到n个)元素,其和为target.
看着很简单吧,不就是遍历嘛,设置条件,记录返回。但如果要求有时间复杂度限制呢?以寻找两个为例,要求O(n)复杂度,遍历肯定不行,做不到,暴力搜索的时间复杂度是n平方。先排序再夹逼,但题目要求是返回下标,这就很恶心了。
题目如下:
Given an array of integers, find two numbers such that they add up to a specific target number.
The function twoSum should return indices of the two numbers such that they add up to the target,
where index1 must be less than index2. Please note that your returned answers (both index1 and index2)are not zero-based.
You may assume that each input would have exactly one solution.
Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2

所以,我们必须找到一个什么东西,然后他能够以近乎常数的时间复杂度进行查找。那是啥?没错,就是哈希表。(但是因为我的VS太老的原因,答案中给出的unordered_map,VS2008并不支持,故退而求其次用map,并从这里开始正式步入C++)
好的,我们开始解题。
首先,思考需要什么数据?嗯,最后要返回下标,那么两个数的下标必须要有。慢着,函数不是只能返回一个值吗?NoNoNo,有一个东西叫做结构体,返回结构体,不就可以访问结构体里面的元素了吗?另外一个方法是隐性的修改,叫做引用传值,类似int function(int& a)。这样的函数在内部对a的修改是实际的修改,会引起实参变动,可以作为一种辅助手段在函数中应用。但是,显然在这里结构体更好用。

//建立struct用于返回多个值
typedef struct NumIndex
{
int iNumIndex1 ;
int iNumIndex2 ;
}NumIndex;

然后,我们需要建立一个类来描述一种解决方案的对象。大概是需要下标,target,哈希表等三种数据;方法就是将vector中存储的数据在map里面做值和下标的映射,然后寻找配对,直至成功。
那么,类就是这个样子的。
注意,public和private分开,尽量不要在public里面出现数据,如果想要访问类的数据,可以在public里面提供一个公有接口。
class TwoSum
{
public:
NumIndex Sulotion(vector Num, int iLength, int iTarget)
{
int i;
int iBuf;
NumIndex Index;
//习惯性写法,算出结构体长度,虽然这个题里面没什么卵用
int iLong = sizeof(Index);
//初始化map映射
for (i=0;i

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值