题目描述

   给定一个整型数组,在数组中找出两个数使这两个数的和为给定数,从小到大输出这两个数在数组中的位置(我们可以假定输出结果只有一个)。例如,输入: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. 深入探讨 ECMAScript 规范第五版

    深入探讨 ECMAScript 规范第五版 随着 Web 应用开发的流行,JavaScript 越来越受到开发人员的重视.作为 ECMAScript 的变体,JavaScript 语言的很多语法特性都 ...

  2. 支付宝ios支付请求Java服务端签名报的一个错(ALI40247) 原创

    今天做app的支付宝支付,遇到些问题,以前做支付宝支付签名都是直接在客户端App进行,今天下了最新版本ios的支付宝支付demo,运行demo时底部有红色的显眼字体,告知用户签名必须在服务端进行... ...

  3. 【4Large-Style】前端框架设计——Button 的设计思路

    Button 的设计 Button 作为基本的 Web 元素,看似简单,却需要非常用心的设计,因为 Button 作为按钮,是具有多个不同的状态,每种状态都基本上需要进行一些特殊的优化设计,以让组件更 ...

  4. DllRegisterServer的调用失败的问题解决方法

    1'按键盘上的win+x键调出常用命令. 2'选择“命令提示符(管理员)“ 3'在”命令提示符“中输入”regsvr32 c:\Windows\SysWOW64\comdlg32.ocx“或其他ocx ...

  5. android jni 总复习(转载)

    本文全文转载自:http://www.cnblogs.com/shuqingstudy/p/4909089.html,非常感谢 package com.test.androidjni; import ...

  6. 使用 flow.ci 快速发布你的项目文档

    软件研发的协作过程中,文档是必不可少的一环,有需求文档.接口文档.使用文档等等.当开始写文档时,首先会遇到两个问题: team members 之间如何协作? 文档 OK 后如何分发,去哪里看?如何更 ...

  7. iOS企业版APP分发上线流程和注意事项

    0.准备 1]$299/year的企业级开发账号. 2]制作分发证书和描述文件,并下载安装到本机. 3]Xcode编译通过,真机测试通过的源码. 1.打包前配置 1]Xcode 打开项目,common ...

  8. ajax提交File文件

    <script type="text/javascript">    $(function() {        $("input[name='image'] ...

  9. AOP的简单练习

    ---恢复内容开始--- 1.AOP的主要作用及概念简介 AOP最大的用处在于事务处理上,业务层在项目中主要负责以下的操作: ·调用数据层进行处理: ·进行事务的处理: ·关闭数据库的连接操作: 但在 ...

  10. AWT与Swing的区别

    AWT 是Abstract Window ToolKit (抽象窗口工具包)的缩写,这个工具包提供了一套与本地图形界面进行交互的接口.AWT 中的图形函数与操作系统所提供的图形函数之间有着一一对应的关 ...