题目描述

   给定一个整型数组,在数组中找出两个数使这两个数的和为给定数,从小到大输出这两个数在数组中的位置(我们可以假定输出结果只有一个)。例如,输入:N={1,4,8,20}, target=12,输出:index_1=2, index_2=3

方案一

描述

  利用C++中的vector和unordered_map尽可能提升程序的运行效率,节约空间,并找出最后的结果。首先回顾一下vector和unordered_map的用法。

vector

vector是C++中的一种数据结构,更确切的说是一个类,相当于一个动态的数组,当一个程序员无法知道自己需要的数组规模有多大时,用其来解决问题已达到最大节约空间的目的。使用vector必须在开头加上#include<vector>,声明一个int向量代替一维数组: vector <int> a;,用vector代替二维数组,只需要声明一个地址的向量:vector <int *> a;,同理多维数组也是如此。下面看vector详细的函数实现功能:
1.push_back   在数组的最后添加一个数据
2.pop_back     去掉数组的最后一个数据 
3.at                    得到编号位置的数据
4.begin             得到数组头的指针
5.end                得到数组的最后一个单元+1的指针
6.front            得到数组头的引用
7.back              得到数组的最后一个单元的引用
8.max_size     得到vector最大可以是多大
9.capacity       当前vector分配的大小,b.容器已经分配的内存最多可以容纳多少个元素
10.size            当前使用数据的大小,a.容器中有多少个元素,而不是容器为了容纳这些元素分配了多少内存
11.resize         改变当前使用数据的大小,如果它比当前使用的大,者填充默认值,c.强制把容器改为容纳n各元素,如果n小于当前大小,容器尾部元素被销毁,如果n大于当前容量,在元素加入之前会发生重新分配,如果n大于当前大小,新默认构造的元素会添加到容器尾部
12.reserve      改变当前vecotr所分配空间的大小,d.强制把容器的容量改为n,如果n小于当前大小,这个调用什么都不做,否则会强制进行一次重新分配
13.erase         删除指针指向的数据项
14.clear          清空当前的vector
15.rbegin        将vector反转后的开始指针返回(其实就是原来的end-1)
16.rend          将vector反转构的结束指针返回(其实就是原来的begin-1)
17.empty        判断vector是否为空
18.swap         与另一个vector交换数据
具体用法:
#include <vector>
 using namespace std
 
vector<int> a;
a.clear();//移除容器中的所有数据
a.empty();//判断容器是否为空
a.erase(pos);//删除pos位置的数据
a.erase(begin,end);//删除[begin,end]区间的数据
a.front();//传回第一个数据
a.insert(pos,elem);//在pos位置插入一个elem拷贝
a.pop_back(elem);//删除最后一个数据
a.push_back(elem);//在尾部加入一个数据
a.resize(num);//重新设置该容器的大小
a.size();//返回容器中实际数据的个数
a.begin();//返回指向容器第一个元素的迭代器
a.end();//返回指向容器的最后一个元素的迭代器
 

unordered_map

unordered_map类似于map,不同的是unordered_map不会根据key的大小进行排序,存储时是根据key的hash值判断元素是否相同,即unordered_map内部元素是无序的,而map中的元素是按照二叉搜索树存储,进行中序遍历会得到有序遍历。所以使用时map的key需要定义operator<。而unordered_map需要定义hash_value函数并且重载operator==。但是很多系统内置的数据类型都自带这些,那么如果是自定义类型,那么就需要自己重载operator<或者hash_value()了。
1. 运行效率:unordered_map高,map效率较低,但是提供了稳定效率和有序的序列
2.内存占用:map内存占用略低,unordered_map较高,而且是线性成比例的
3.选用:无需容器,快速查找删除,不担心略高的内存时用unordered_map。有序容器稳定查找删除效率。内存很在意时用map
 

核心代码

 

vector<int> TWOSUN::towSum(vector<int>& array, int target)
{
unordered_map<int, int> hash;
//key是数组的数字,value是数组的索引
vector<int> result;
for (int i = 0; i < array.size(); i++)
{
int numToFind = target - array[i];
if (hash.find(numToFind) != hash.end())
{
result.push_back(hash[numToFind] + 1);
result.push_back(i + 1);
return result;
}
//没有找到
hash[array[i]] = i;
}
return result;
}

 

方案二

与方案一思想相同的java版本
核心代码如下:
public int[] twoSum_01(int[] array,int target){
int[] result=new int[2];
Map<Integer,Integer> map=new HashMap<Integer,Integer>();
for(int i=0;i<array.length;i++)
{
if(map.containsKey(target-array[i])){
result[0]=map.get(target-array[i]);
result[1]=i+1;
return result;
}
map.put(array[i],i+1);
}
return result;
}

方案三

思想不同于前两者,而是将每一个target-array[i]存到Hashmap中,核心代码如下:
public int[] twoSum_02(int[] array,int target){
HashMap<Integer,Integer> tracker=new HashMap<Integer,Integer>();
int len=array.length;
for(int i=0;i<len;i++)
{
if(tracker.containsKey(array[i])){
int left=tracker.get(array[i]);
return new int[]{left+1,i+1};
}else{
tracker.put(target-array[i],i);
}
}
return new int[2];
}

Leetcode_001_TwoSum_求和为固定数的两个数的索引的更多相关文章

  1. python3的leetcode题,两个数求和等于目标值,返回这两个数的索引组成的列表(三种方法)

    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为gai目标值的 两个 整数. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例: 给定 ...

  2. 001 Two Sum 两个数的和为目标数字

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...

  3. 【C语言】在两个数成对出现的数组中找到一个单独的数。

    //在两个数成对出现的数组中找到一个单独的数.比如{1,2,3.3,1,4.2},即找出4 #include <stdio.h> int find(int arr[], int len) ...

  4. 17.从键盘上输入一个正整数n,请按照以下五行杨辉三角形的显示方式, 输出杨辉三角形的前n行。请采用循环控制语句来实现。 (三角形腰上的数为1,其他位置的数为其上一行相邻两个数之和。) 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1

    17.从键盘上输入一个正整数n,请按照以下五行杨辉三角形的显示方式, 输出杨辉三角形的前n行.请采用循环控制语句来实现. (三角形腰上的数为1,其他位置的数为其上一行相邻两个数之和.) 1 1 1 1 ...

  5. 给定两个数组,这两个数组是排序好的,让你求这两个数组合到一起之后第K大的数。

    题目:给定两个数组,这两个数组是排序好的,让你求这两个数组合到一起之后第K大的数. 解题思路: 首先取得数组a的中位数a[aMid],然后在b中二分查找a[aMid],得到b[bMid],b[bSt] ...

  6. 【C语言】给一组组数,仅仅有两个数仅仅出现了一次,其它全部数都是成对出现的,找出这两个数。

    //给⼀组组数,仅仅有两个数仅仅出现了一次.其它全部数都是成对出现的,找出这两个数. #include <stdio.h> int find_one_pos(int num) //找一个为 ...

  7. 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。

    描述 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target. 你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标.注意这里下标的范围是 0 到 n-1. ...

  8. 2020-06-22:已知两个非负数的异或值为M,两数之和为N,求这两个数?

    福哥答案2020-06-22: 1.遍历法时间复杂度:O(N)最好空间复杂度:O(1)平均空间复杂度:O(sqrt(N))最坏空间复杂度:O(N)[0,N/2]依次遍历,符合条件的就是需要的结果. 2 ...

  9. 【剑指offer学习】求和为定值的两个数(拓展)

    接着上面一篇文章: http://blog.csdn.net/u013476464/article/details/40651451 接下来我们拓展一下题目,如果数组是乱序的,并且规定数组中的元素所有 ...

随机推荐

  1. Ionic在windows下的环境配置难题

    具体的配置方法网上有很多,可以参考http://my.oschina.net/JeeChou/blog/219699?fromerr=k1hPtBUs,但问题还是会有,我总结的主要有以下几个方面: 1 ...

  2. 内功心法 -- java.util.ArrayList<E> (5)

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...

  3. 认识 getAttribute() setAttribute()

    getAttribute()方法不属于document对象,所以不能通过document对象调用,它只能通过元素节点对象调用 var paras = document.getElementsByTag ...

  4. 进程——wait与waitpid、僵尸进程与孤儿进程

    僵尸进程:子进程终止了,但是父进程没有回收子进程的资源PCB.使其成为僵尸进程 孤儿进程:父进程先与子进程结束了,使得子进程失去了父进程,这个时候子进程会被1号进程init进程领养,成为孤儿进程 为了 ...

  5. Python抓取第一网贷中国网贷理财每日收益率指数

    链接:http://www.p2p001.com/licai/index/id/147.html 所需获取数据链接类似于:http://www.p2p001.com/licai/shownews/id ...

  6. 数字信号处理MATLAB简单序列

    数字信号处理应用的几个基本序列: 1 单位样本序列 function mainImseq() clc clear disp('生成抽样序列'); y=imseq(,,); %调用样本函数,此时序列下标 ...

  7. java 文件操作 写入和读取(小结一)

    参考了这篇博客并优化,谢谢:http://blog.sina.com.cn/s/blog_99201d890101b4le.html 功能:  实现通过两个类完成先写入文件,再读取数据计算显示 pac ...

  8. docker - 容器里安装mysql

    在docker中安装mysql ubuntu官方镜像是精简的ubuntu系统,很多软件和库没有安装,所以直接安装mysql的话依赖较多,建议直接从源码编译安装mysql 通过命令行安装 先启动一个容器 ...

  9. android开发过程中踩过的坑

    1) 4.X下 viewgroup 不一定会向下传递requestLayout,当onlayout的速度比较慢(比如子View比较复杂之类的原因),系统会跳帧!此时子View下层的view可能就不会再 ...

  10. 在java中的Try Catch块-------------异常处理(2)

    1. Try块是什么? Try块是一块可能产生异常的代码块,一个Try块可能跟着Catch块或者Finally块,或者两者. Try块的语义: try{ //statements that may c ...