【Leetcode】【Medium】Two Sum
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
本题特点:
1、无序数组;
2、结果唯一;
解题1:o(nlogn)
1、对数组进行排序;o(nlogn)
2、在有序数组中寻找和等于target的两个数a,b;o(n)
解题步骤:
1、新建数组副本,并对副本排序;
2、从有序副本的两端开始查找,找到和等于target的两个数,记录其下标为i和j;
3、两遍遍历原数组,第一遍寻找a[i]的原始位置index1,第二遍寻找a[j]的原始位置index2;(比一遍遍历具有更少的比较次数)
4、按照从小到大的顺序生成返回数组,返回index1和index2;
注意:
1、原数组中可能包含重复的元素;
2、不能使用原数组排序,本题需要记录原数组元素顺序。即使不需要原始顺序,如无特殊要求,也不应该在函数内对原数组进行操作;
3、同时,此题在细节的时间复杂度要求非常苛刻(亲测):
①、即使相同时间复杂度的排序算法,也有很大区别,此题排序时必须使用最优秀的nlogn算法,即STL源码中使用的优化改进后的快速排序算法;我使用了标准堆排序算法,未能通过;
②、对数组元素进行比较和交换操作,不如先对整数进行比较和交换,然后再赋值给数组;
③、减少所有不必要的赋值、比较和交换操作;
代码:
class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
int length = numbers.size();
vector<int> numbers_copy = numbers;
sort(numbers_copy.begin(), numbers_copy.end());
int i = ;
int j = length - ;
while (i < j) {
if (numbers_copy[i] + numbers_copy[j] < target)
i++;
else if (numbers_copy[i] + numbers_copy[j] > target)
j--;
else
break;
}
int index1 = ;
int index2 = length - ;
while(index1 < length && numbers_copy[i] != numbers[index1])
index1++;
while(index2 > && numbers_copy[j] != numbers[index2])
index2--;
if (index1 > index2)
swap(index1, index2);
vector<int> result {index1 + , index2 + };
return result;
}
};
解题2:
使用哈希表,使查找的复杂度为o(1),达到o(n)时间复杂度;
解题步骤:
1、新建一个两元素数组作为返回数组,再新建一个hash表结构;
2、遍历原始数组,遇到的每一个元素i:
如果hash表中已存在target - a[i],则a[i]和target - a[i]就是要找的两个数,且target-a[i]先出现;
如果hash表中不存在,则将键a[i]传入hash表,值设置为其下标值i;(注意此时hash表中可能已经存在a[i])
代码:
class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
vector<int> result();
unordered_map<int, int> hmap;
int length = numbers.size();
for (int i = ; i < length; ++i) {
if (hmap.find(target - numbers[i]) != hmap.end()) {
result[] = hmap[target - numbers[i]] + ;
result[] = i + ;
return result;
} else {
hmap[numbers[i]] = i;
}
}
return result;
}
};
【Leetcode】【Medium】Two Sum的更多相关文章
- 【LeetCode题意分析&解答】40. Combination Sum II
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in ...
- 【LeetCode题意分析&解答】37. Sudoku Solver
Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...
- 【LeetCode题意分析&解答】35. Search Insert Position
Given a sorted array and a target value, return the index if the target is found. If not, return the ...
- ACM金牌选手整理的【LeetCode刷题顺序】
算法和数据结构知识点图 首先,了解算法和数据结构有哪些知识点,在后面的学习中有 大局观,对学习和刷题十分有帮助. 下面是我花了一天时间花的算法和数据结构的知识结构,大家可以看看. 后面是为大家 精心挑 ...
- 【LeetCode每天一题】Minimum Path Sum(最短路径和)
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...
- 【leetcode刷题笔记】Combination Sum II
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in ...
- 【leetcode刷题笔记】Path Sum
Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all ...
- 【leetcode刷题笔记】Sum Root to Leaf Numbers
Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number ...
- 【LeetCode题意分析&解答】39. Combination Sum
Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C wher ...
- 【LeetCode每天一题】Combination Sum II(组合和II)
Given a collection of candidate numbers (candidates) and a target number (target), find all unique c ...
随机推荐
- JDBC(5)-处理大数据
大数据对象处理主要有CLOB(character large object) 和BLOB(binary large object) 两种类型的字段. 在CLOB中可以存储大字符对象,比如长篇小说:在B ...
- Monkey入门之如何在android虚拟机中安装apk包
如果想把公司的产品apk包安装到android虚拟机中,应该进行如下操作: 1.首先将apk包放到C:\Program Files\Android\android-sdk\platform-tools ...
- 关于table-layout的用法
定义:tableLayout 属性用来显示表格单元格.行.列的算法规则. 自动表格布局:auto(默认) 在自动表格布局中,列的宽度是由列单元格中没有折行的最宽的内容设定的. 此算法有时会较慢,这是由 ...
- <? extends A> 和 <? super A> 的意思
/** * @author Lee Boynton * @author Arthur van Hoff * @author Martin Buchholz * @author Ulf Zibis * ...
- window.location.href.substr(window.location.href.length - 6)
if (window.location.href.substr(window.location.href.length - 6) == "flag=1") { var tOptio ...
- jQuery 整体架构
不同于 jQuery 代码各个模块细节实现的晦涩难懂,jQuery 整体框架的结构十分清晰,按代码行文大致分为如上图所示的模块. 初看 jQuery 源码可能很容易一头雾水,因为 9000 行的代码感 ...
- 利用WebBrowser控件实现百度自动搜索
(1)新建一个MFC对话框项目 (2)对话框中添加WebBrower控件,添加方法:点击菜单栏工具->选择工具箱项->在弹出的选择工具箱项对话框选择COM组件->Microsoft ...
- AngularJS 指令 实现文本水平滚动效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 中南oj 1216: 异或最大值 数据结构
1216: 异或最大值 Time Limit: 2 Sec Memory Limit: 128 MB Submit: 98 Solved: 29 [Submit][Status][Web Boar ...
- Win7下硬盘安装Ubuntu双系统
一. 准备工作 1. 下载ubuntu镜像文件:Ubuntu-14.04.5-desktop-amd64.iso(4G及以上内存建议64位) 注意这个amd并不是指amd芯片. 2. 下载硬盘分区工具 ...