题目描述:
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, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
实现
1.暴力解法
思路:两层循环遍历nums,判断两数之和是否为target,如果是则返回当前的索引。时间复杂度是O(n^2),运行时间92ms。
public class Solution {
public int[] twoSum(int[] nums, int target) {
Stack s = new Stack();
s.clear();
if(target < 0) {
target = Math.abs(target);
for(int i = 0;i < nums.length;i++) {
nums[i] = Math.abs(nums[i]);
}
}
for(int i = 0;i < nums.length;i++) {
if(nums[i] <= target) {
for(int j = i+1;j < nums.length;j++) {
if(nums[i] + nums[j] == target) {
s.push(i);
s.push(j);
}
}
}
}
int len = s.size();
int[] ret = new int[len];
for(int i = len-1;i >= 0;i--) {
ret[i] = (int)s.pop();
}
return ret;
}
}
2.用哈希表实现
思路:将nums用哈希表存储起来,以nums的值为键,对应的索引为槽。循环遍历nums,判断target-num是不是在哈希表中,如果在的话再对比键对应的索引是否与当前遍历的索引相同,如果不同则得到两个索引,因为每个描述只有一个输出,所以这两个索引就是我们需要返回的结果。这个算法的时间复杂度是O(n),好于暴力解法。
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
map = {}
rlist = []
for i,num in enumerate(nums):
if(target-num) in map:
if(map[target-num] != i):
rlist.append(map[target-num])
rlist.append(i)
return rlist
else:
map[num] = i