Description
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].
分析
题目的意思是:给定一个数组和一个target,然后找出数组中的两个数的和为target的位置。
- 用一个hashmap存放遍历过的值,键为数组元素,值为索引。每次判断target-当前的值是否存在就可以判定数组中是否存在两个数的和为target了。
java代码
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> m;
for(int i=0;i<nums.size();i++){
if(m.count(target-nums[i])){
return {i,m[target-nums[i]]};
}
m[nums[i]]=i;
}
return {};
}
};
python代码
python除了用字典O(n)的解法外,还有一个O(nlogn+n)的解法,即先排序再双指针遍历,最后遍历求出两数的位置。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
arr=[item for item in nums]
arr.sort()
i=0
j=len(arr)-1
while(i<j):
if(arr[i]+arr[j]>target):
j-=1
elif(arr[i]+arr[j]<target):
i+=1
else:
break
res=[]
for k in range(len(nums)):
if(nums[k]==arr[i] or nums[k]==arr[j]):
res.append(k)
return res
Python
用hash表解决。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
m={}
for i,num in enumerate(nums):
if target-num in m:
return [i,m[target-num]]
m[num]=i