【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 ...
随机推荐
- Python学习--猫眼电影TOP100榜单抓取
import requests import re import json import time def get_one_page(url): headers={'User-Agent':'Mozi ...
- OSI与TCP/IP协议区别
1 OSI参考模型 谈到网络不能不谈OSI参考模型,虽然OSI参考模型的实际应用意义不是很大,但其的确对于理解网络协议内部的运作很有帮助,也为我们学习网络协议提供了一个很好的参考.在现实网络世界里,T ...
- 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16
一.Intel 32 位处理器的工作模式 如上图所示,Intel 32 位处理器有3种工作模式. (1)实模式:工作方式相当于一个8086 (2)保护模式:提供支持多任务环境的工作方式,建立保护机制 ...
- git忽略ssl认证
问题 在是用git克隆仓库的时候,报错如下: fatal: unable to access ‘https://github.com/........../‘: OpenSSL SSL_connect ...
- Expression Blend实例中文教程(13) - 控件模板快速入门ControlTemplates
上篇,介绍了控件样式(Style)和模板(Template)的基础概念,并且演示了使用Blend设计控件样式.本篇将继续介绍使用Blend设计自定义控件模板 - ControlTemplate.Con ...
- C++Array类模板编写笔记
C++Array类模板 函数模板和类模板都属于泛型技术,利用函数模板和类模板来创建一个具有通用功能的函数和类,以支持多种不同的形参,从而进一步简化重载函数的函数体设计. 声明方法:template&l ...
- java 的数据库操作--JDBC
一.java与数据库的交互 1.jdbc:java data base connectivity,java数据库连接.java的JDBC操作主要通过操作两个类进行连接操作:Connection 和 S ...
- IntelliJ IDEA 快捷键(一)(window版)
一.高效定位代码 1.跳转 1.项目之间的跳转 Next Project Window 快捷键 Ctrl + Alt + 左方括号. Previous Project Window 快捷键 Ctrl ...
- Hql语句转化为sql语句中文乱码问题
刚刚学习Hql语句就出现这一的问题,百度半天终于解决了,总结一下解决的方案: 出现中文乱码最可能的原因是hibernate配置文件配置的问题 1.检查url路径是否指定字符集为UTF-8 <pr ...
- IO流之 commons-IO
commons-IO 导入classpath 加入classpath的第三方jar包内的class文件才能在项目中使用 创建lib文件夹 将commons-io.jar拷贝到lib文件夹 右键点击co ...