1. Two Sum
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return[0, 1].
UPDATE(2016 / 2 / 13) :The return format had been changed to zero - based indices.Please read the above updated description carefully.
思路:
首先,不能对该数组作任何预处理。因为要求返回是原始数组的下标,如果对数组进行了排序,那么下标就会乱。(如果是有序数组,可以用双指针来做,参见Two Sum II - Input array is sorted)
很容易想到用<value, index>的映射表。遍历numbers,在映射表中寻找target-numbers[i],若找到则结束,返回存储的下标+1和当前下标+1. (注意题目中规定,以1作为起始下标),若找不到则将<numbers[i], i>加入映射表。
NOTE:
这里又有一个问题,C++中常用的映射表有map, unordered_map。
1 | map: |
1 | unordered_map: |
本题只需要根据key访问单个元素,因此unordered_map更合适。
时间复杂度O(n):一次遍历
空间复杂度O(n):unordered_map
ps: 严格来说,target-numbers[i]可能溢出int,因此提升为long long int更鲁棒。
1 | class Solution { |
Java Code:
1 | class Solution { |