Lintcode--2(56)--两数之和
题目:给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。
你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是 0 到 n-1。
注意事项
你可以假设只有一组答案。
样例
给出 numbers = [2, 7, 11, 15], target = 9, 返回 [0, 1].
1.暴力搜索,复杂度为O(n2)
class Solution {
public:
/*
* @param numbers: An array of Integer
* @param target: target = numbers[index1] + numbers[index2]
* @return: [index1 + 1, index2 + 1] (index1 < index2)
*/vector<int> twoSum(vector<int> &numbers, int target)
{ // write your code here vector<int> idx(2);//申请一个大小为2的容器存放下标 for(int i=0; i<numbers.size(); i++) { for(int j=numbers.size()-1; j>=0; j--) { if(numbers[i]+numbers[j]==target && i!=j) { idx[1] = i; idx[0] = j; } } }if(idx[0]>idx[1])//交换两数 { idx[0] = idx[0]^idx[1]^idx[0];//方法错误,输出的都是0 idx[1] = idx[0]^idx[1]^idx[1];}return idx;}
};
注意:上述交换两数的方法输出的都是0
2、哈希表,复杂度为O(n)
原理:基本原理:创建一个hashmap,先把所有的值存在hashmap中,其中关键字key是元素的值,value为对应元素的下标。待查找的关键字为target - nums[i],遍历数组直到找到则返回其在数组中的下标。时间复杂度为O(n)。
class Solution {
public:/** @param numbers : An array of Integer* @param target : target = numbers[index1] + numbers[index2]* @return : [index1+1, index2+1] (index1 < index2)*/vector<int> twoSum(vector<int> &nums, int target) {// write your code hereint size = nums.size();int i = 0;vector<int> result;//这里不能定义长度为2,否则会输出四个数if(size < 2) //判断是否为空{return result;}map<int, int> hashMap;//创建一个map,key是元素的值,value是元素原来的下标for(i=0; i<size; i++) {hashMap.insert(pair<int, int>(nums[i], i));//把所有的元素值和下标插入到map}for(i=0; i<size; i++) {int temp = target - nums[i];if (hashMap.count(temp)!=0 && hashMap[temp]!=i) //hashMap.count(temp)是temp在表中出现的次数{result.push_back(i);result.push_back(hashMap[temp]);break;//只要找到就跳出循环}}if(result[0] > result[1]) //调整大小顺序{int temp = result[0];result[0] = result[1];result[1] = temp;}return result;}
};
参考:1.https://www.cnblogs.com/libaoquan/p/6808064.html
2.http://blog.csdn.net/kkdd2013/article/details/51953035
Lintcode--2(56)--两数之和相关推荐
- 领扣LintCode算法问题答案:56. 两数之和
56. 两数之和 描述 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target. 你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标.注意这里下标的范围是 ...
- LeetCode/LintCode 题解丨一周爆刷双指针: 两数之和
描述 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target. 你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标.注意这里下标的范围是 0 到 n-1. ...
- 【算法】哈希表 ( 两数之和 )
算法 系列博客 [算法]刷题范围建议 和 代码规范 [算法]复杂度理论 ( 时间复杂度 ) [字符串]最长回文子串 ( 蛮力算法 ) [字符串]最长回文子串 ( 中心线枚举算法 ) [字符串]最长回文 ...
- 两数之和、三数之和、四数之和、K数之和
两数之和.三数之和.四数之和和K数之和是最近听室友提起的几道有意思的基础题,可以说是把双指针运用的淋漓尽致.(K数之和其实是一个动态规划的题,此处因为满足*数之和的的结构,放在一起对比提一下). 1. ...
- 【计算两数之和】不使用加减乘除
计算两数之和不论在计算机中还是生活中,都不算难(即使某些数据过大).但是如何能更高效的计算时一个难题,或者说在计算机内部是如何解析两个数之间的加法的,这就成了一个可以探讨的问题. 当然我们很了解十进制 ...
- 【每日一算法】两数之和 IV - 输入 BST
微信改版,加星标不迷路! 每日一算法-两数之和IV-输入BST 作者:阿广 阅读目录 1 题目 2 解析 1 题目 给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目 ...
- java 1099_【LeetCode(Java) - 1099】小于 K 的两数之和
[LeetCode(Java) - 1099]小于 K 的两数之和 [LeetCode(Java) - 1099]小于 K 的两数之和 文章目录 1.题目描述 2.解题思路 3.解题代码 1.题目描述 ...
- Leetcode刷题第1题:两数之和(基于Java语言)
** Leetcode刷题第1题:两数之和(基于Java语言) ** 题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标 ...
- 【前端来刷LeetCode】两数之和与两数相加
大部分玩前端的小伙伴,在算法上都相对要薄弱些,毕竟调样式.调兼容就够掉头发的了,哪还有多余的头发再去折腾. 确实在前端中需要使用到算法的地方是比较少,但若要往高级方向发展,算法的基本功就非常重要啦.对 ...
最新文章
- 查找数组键名是否存在
- CS48 D BIT
- 两个串口通信助手之间通信_串口通信原理
- xcode 重新来过openssl项目历程
- Ubuntu13.04配置优化(二)转贴
- 漫画:什么是B+树?
- Jmeter使用教程(图文并茂)|实战干货
- 网线制作和交换机工作原理
- java习题5参考练习及答案_JAVA练习题(第5章).ppt
- UnityMMO资源整合服务器部署
- [c/c++]trivial/POD类型和standard layout
- 古镇、温泉、阳澄湖品蟹二日游--这个周末,终于放松了一下。
- 北京交通大学c语言作业,北京交通大学c语言综合程序设计(黄宇班).doc
- python调用woff_GitHub - zergtant/python-maoyan-spider: woff-xml解码 “猫眼网反爬虫机制” 的爬虫。...
- MySQL百万级压测数据表
- 深度学习网络中backbone是什么意思
- [嘿就这么样吧 谁看谁的脸色]井冈春天牌演.活力果子
- 用php实现日历输出,php 实现日历
- 历史上最牛的演讲—甲骨文总裁拉里埃里森在耶鲁大学的演讲
- 后浪程序猿 996 摸鱼求生指南
热门文章
- pythonqt4上位机开发_「新阁教育」自由口通信上位机实战案例
- Ubuntu系统中利用Sublime分别运行Python与Python3
- 怎么样解决小交换机引起的路由环路故障?
- 【渝粤教育】国家开放大学2018年春季 3780-21T燃气设备操作与维护 参考试题
- 【渝粤题库】陕西师范大学200041 文学概论 作业
- mysql主从延时这么长_MySQL主从延迟问题解决
- 一文读懂:常见低通、高通、带通三种滤波器的工作原理
- 怎么在自己的网站上显示其它网站_自己做网站要怎么选域名?
- 【2021.02.09更新】数字信号处理公式推导
- 数据结构单链表SingleLinkedList,Java实现单链表增删改查