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

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

相关文章推荐

表单form中2个submit2个action 和 hibernateTemplate模糊查询/多条件组合复合随机查询的写法

如果想在一个表单中 同时设置两个submit,比如  添加  和查询,  那么自然得设置  2个action,但其实不用设置两个action 只需要通过button设置即可 这种情况弃用 su...

vector, list, map在遍历时删除符合条件的元素

直接看源码,内有详细解释

map等关联容器 vector等序列容器 如何防止迭代器失效 即erase()的使用

http://www.cnblogs.com/my_life/articles/2018852.html  序列性容器::(vector) erase迭代器不仅使所有指向被删元素的迭代器失效,而且使被...

map等关联容器 vector等序列容器 如何防止迭代器失效

序列性容器::(vector)   erase迭代器不仅使所有指向被删元素的迭代器失效,而且使被删元素之后的所有迭代器失效,所以不能使用erase(iter++)的方式,但是erase的返回值为下...
  • nxx_168
  • nxx_168
  • 2012年06月17日 13:33
  • 2655

LeetCode 290 Word Pattern(单词模式)(istringstream、vector、map)(*)

翻译给定一个模式,和一个字符串str,返回str是否符合相同的模式。这里的符合意味着完全的匹配,所以这是一个一对多的映射,在pattern中是一个字母,在str中是一个为空的单词。例如: patter...
  • NoMasp
  • NoMasp
  • 2016年01月30日 15:43
  • 1718

※ Leetcode - Array - 380. Insert Delete GetRandom O(1)(vector+map实现set)

1. Problem Description Design a data structure that supports all following operations in average O(1...

LeetCode 205 Isomorphic Strings(同构的字符串)(string、vector、map)(*)

翻译给定两个字符串s和t,决定它们是否是同构的。如果s中的元素被替换可以得到t,那么称这两个字符串是同构的。在用一个字符串的元素替换另一个字符串的元素的过程中,所有字符的顺序必须保留。 没有两个字符可...
  • NoMasp
  • NoMasp
  • 2016年01月30日 14:16
  • 2726

LeetCode 169 Majority Element(主要元素)(vector、map)

翻译给定一个长度为n的数组,找出主要的元素。所谓主要的元素是指的出现次数超过⌊ n/2 ⌋次的元素。你可以假定这个数组是非空的,并且“主要元素”一定是存在的。原文Given an array of s...
  • NoMasp
  • NoMasp
  • 2016年01月12日 15:48
  • 1613

[C++]LeetCode: 114 Permutation Sequence(返回第k个阶乘序列——寻找数学规律)

题目: The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling ...

XML布尔判定[1]——生成条件组合

最近在写毕设,用到MyBatis,发现里面有个动态SQL的XML判定 但是,这里不是关于MyBatis后台实现的,呵呵,那个有机会再去看看后台实现 翻出去年实习写的一个半成品 需求: ...
  • wklken
  • wklken
  • 2011年05月09日 20:17
  • 1885
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LeetCode-从vector到map——在序列中寻找复合条件的组合
举报原因:
原因补充:

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