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的更多相关文章

  1. 【LeetCode题意分析&解答】40. Combination Sum II

    Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in ...

  2. 【LeetCode题意分析&解答】37. Sudoku Solver

    Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...

  3. 【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 ...

  4. ACM金牌选手整理的【LeetCode刷题顺序】

    算法和数据结构知识点图 首先,了解算法和数据结构有哪些知识点,在后面的学习中有 大局观,对学习和刷题十分有帮助. 下面是我花了一天时间花的算法和数据结构的知识结构,大家可以看看. 后面是为大家 精心挑 ...

  5. 【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 ...

  6. 【leetcode刷题笔记】Combination Sum II

    Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in ...

  7. 【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 ...

  8. 【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 ...

  9. 【LeetCode题意分析&解答】39. Combination Sum

    Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C wher ...

  10. 【LeetCode每天一题】Combination Sum II(组合和II)

    Given a collection of candidate numbers (candidates) and a target number (target), find all unique c ...

随机推荐

  1. selenium 多窗口(windows)及ITargetLocator使用总结

    1. selenium能实现窗口切换的原理 2. 常见命令 2.1 WindowHandle 2.2 WindowHandles 2.3 SwitchTo 3. 使用JavaScript新建窗口 4. ...

  2. 汉诺塔问题java实现

    问题描述 三个柱子,起初有若干个按大小关系顺序安放的盘子,需要全部移动到另外一个柱子上.移动规则:在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘. 解题思路 使用递归算法进行处理,实在理不 ...

  3. android 小工具:pc 上用 curl 命令打开手机浏览器,浏览指定网址

    测试 API 时或其它情况经常需要在手机浏览器中输入 url 一长串的 url 输起来真是麻烦 AirDroid 很强大也不用数据线,但有时老断开连接,不是很爽.发到手机 qq 吧还得手动粘贴 所以自 ...

  4. [转载]java.ByteArrayInputStream与ByteArrayOutputStream再次理解

    一次看到ByteArrayOutputStream的时候是在Nutch的部分源码,后来在涉及IO操作时频频发现这两个类的踪迹,觉得确实是很好用,所以把它们的用法总结一下. ByteArrayOutpu ...

  5. 关于数据库NULL值的几个问题思考

    最近在写项目,拼接SQL时,发现好多关于NULL值的问题,现在把这些问题整理出来,以供日后参考. 对于Oracle数据库: 一.排序 Oracle对于null值的排序,有一个函数可以进行操作: 在默认 ...

  6. ubuntu系统之难

    声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站 ...

  7. Java日记

    总结关于Java web一些知识 VisualVM性能分析    ——  更好的理解JVM中的参数 JVM初始    ——    理解JVM 自己的Java开发规范  ——  个人Java开发是遵循的 ...

  8. HAProxy与Nginx区别

    1)HAProxy对于后端服务器一直在做健康检测(就算请求没过来的时候也会做健康检查):后端机器故障发生在请求还没到来的时候,haproxy会将这台故障机切掉,但如果后端机器故障发生在请求到达期间,那 ...

  9. 带有Apache Spark的Lambda架构

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 目标 市场上的许多玩家已经建立了成功的MapReduce工作流程来每天处理以TB计的历史数据.但是谁愿意等待24小时才能获得最新的分析结果? ...

  10. bzoj 5315: [Jsoi2018]防御网络

    Description Solution 考虑每一条边的贡献 对于树边,如果两边各存在一个点,那么有贡献,总贡献就是 \((2^{size}-1)*(2^{n-size}-1)\) 分别对应两边的 \ ...