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

原创 2017年01月03日 00:15:04

这两天由于在忙其他事情,编程这边效率不是很高,学习进度受限。今天主要是总结下连续两个在算法上比较简单的问题——也就是说,难在实现上。
两个问题可以合并,简单来讲就是在一个有序序列中寻找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

版权声明:本文为博主原创文章,未经博主允许不得转载。

组合索引,前置列与where条件关系

SQL> create table t1 as select * from dba_objects; Table created. SQL> create index idx_z on t1(ob...
  • launch_225
  • launch_225
  • 2014年05月10日 22:03
  • 1105

【概率论与数理统计.1.概率基础】--条件概率,复合概率(乘法定理)

【概率论与数理统计.1.概率基础】–-条件概率,复合概率(乘法定理) 1)条件概率 P(B|A)=P(AB)P(A),P(A)>0P(B|A) = \frac{P(AB)}{P(A)},P(A)>...
  • lynn0085
  • lynn0085
  • 2017年12月30日 11:00
  • 39

C++寻找数组元素组合之和为给定数

问题描述:a=[2,3],b=6,将数组a中各个元素组合起来,让其和等于b。求这样的组合。 这道题很简单,组合有两种2+2+2 和 3+3上面,是室友大半夜微信问我的一道程序题(大周五,博主正在家休...
  • zxc024000
  • zxc024000
  • 2016年08月20日 12:02
  • 1019

联合索引优化多条件查询

联合索引是由多个字段组成的组合索引。若经常需要使用多个字段的多条件查询(WHERE col1 = … AND col2 = … AND col3 = …),可以考虑使用联合索引。现在数据表myInde...
  • qq_33290787
  • qq_33290787
  • 2016年07月19日 00:39
  • 4943

C++中vector和map使用详解

标准库Vector类型 使用需要的头文件: #include Vector:Vector 是一个类模板。不是一种数据类型。 Vector是一种数据类型。 一、 定义和初始化 Vecto...
  • bzhxuexi
  • bzhxuexi
  • 2014年04月20日 14:31
  • 10168

java复合语句与条件语句

在Java语言中,块语句也称复合语句,是用(花括号{})括起来的语句集合 典型例子,复合语句以整个块为单位,可以用在任何一个单独语句可以用到的地方,并且在复合语句中还可以嵌套复合语句. if(布尔...
  • Acmen_k
  • Acmen_k
  • 2016年05月13日 11:40
  • 1632

关于Vector和Map查找效率的惊人的实际测试结果

最近在项目中有一种结构体数据需要存储,数据结构体如下 typedef mystruct { int ID; ......//其他的数据成员 double pinwei; }; ...
  • HW140701
  • HW140701
  • 2017年04月25日 18:40
  • 3103

题目1554:区间问题 map<int , vector<int> >的使用

题目1554:区间问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:966 解决:78 题目描述: 给定一个数组,判断数组内是否存在一个连续区间,使其和恰好等于给...
  • u013491262
  • u013491262
  • 2014年03月17日 20:26
  • 1784

继承、实现、依赖、关联、聚合、组合的联系与区别

继承、实现、依赖、关联、聚合、组合的联系与区别 分别介绍这几种关系: 继承 指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力...
  • kevin_darkelf
  • kevin_darkelf
  • 2013年09月08日 11:17
  • 26630

[Elasticsearch] 全文搜索 (二) - 多词查询及查询的合并

多词查询(Multi-word Queries) 如果我们一次只能搜索一个词,那么全文搜索就会显得相当不灵活。幸运的是,通过match查询来实现多词查询也同样简单: GET /my_ind...
  • dm_vincent
  • dm_vincent
  • 2014年12月04日 10:08
  • 64787
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LeetCode-从vector到map——在序列中寻找复合条件的组合
举报原因:
原因补充:

(最多只允许输入30个字)