两数之和(一、二)
LeetCode 上的两个两数之和问题,一个是输入的有序数组,一个无序,解法稍有偏差,这里在何涛大佬的帮助下多放几种解法!
两数之和(输入有序数组)
题目要求
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
说明:
返回的下标值(index1 和 index2)不是从零开始的。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例:
1 | 输入: numbers = [2, 7, 11, 15], target = 9 |
暴力解决
嵌套 for 循环,时间复杂度 O(n²),慢就完事了
1 | class Solution { |
双指针解决
思路
双指针解法,定义头尾两个指针分别代表输入数组的首末元素,定义 while 循环检测两元素相加与 target 对比大小,小的话就头指针后移,大的话就尾指针前移(因为数组是有序的!),这样折半查找来找到这两个数
代码
1 | class Solution { |
两数之和(输入无序数组)
题目要求
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
1 | 给定 nums = [2, 7, 11, 15], target = 9 |
使用 unordered_map 解决
思路
首先因为输入的数组是无序的,不可以直接使用双指针的解法来作答,但是既然不能两个元素两个元素查,那就一个元素一个元素查吧!先定义一个 unordered_map(使用无序 map 是因为要比普通 map 更快),然后使用 for 循环来遍历整个数组,流程是:两个数相加遍历时两个加数总要有一个先被遍历到,这时候因为 map 中没有与之匹配的另一个加数,这时候就把当前遍历到这个加数放进 map 中,等到循环遍历到另一个加数时,就可检测到之前放入 map 中的加数,这样这道题就解决了
代码
1 | class Solution { |
先排序再用双指针
思路
既然输入的数组无序!那就给他排序!排序后就可以按照有序数组的解法来解决啦,不过这里需要注意数组下标的问题,因为重新排序后,原数组的下标就被打乱了,所以需要使用另一个数组先记录原数组的个元素位置,最后再另一个数组里找到元素组对应元素的下标值返回就好了
代码
1 | class Solution { |