题目:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
解法1:暴力解法,两层遍历,第二层只需遍历第一层取的数以后的数,用时6440ms
class Solution:
def twoSum(self,nums,target):
n = len(nums)
for x in range(n):
for y in range(x+1,n):
if nums[x] + nums[y] == target:
return x,y
break
else:
continue
解法二:一次循环,使用index函数获取角标,用时476ms
class Solution:
def twoSum(self,nums, target):
j=-1
for i in range(1,len(nums)):
temp = nums[:i]#i是num1,从i开始倒叙遍历前面的数(遍历后面也行)
if (target - nums[i]) in temp:#如果另一个数存在
j = temp.index(target - nums[i])
break
if j>=0:
return [j,i]
解法三:通过哈希来求解,这里通过字典来模拟哈希查询的过程。
个人理解这种办法其实就是字典记录了 num1 和 num2 的值和位置,遍历同时查字典,而省了再查找 num2 索引的步骤,num2 不需要在整个 dict 中去查找,可以在 num1 之前的 dict 中查找,因此就只需要一次循环可解决。用时48ms
class Solution:
def twoSum(self, nums, target):
dct={}#相当于hashmap
for i,n in enumerate(nums):
t=target-n#i是num1的标,t是num2的值,在num1之前查找num2
if t in dct:
return [dct[t],i]
else:
dct[n]=i#用dct存放角标,省去索引num2的时间
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer>map=new HashMap<>();
for(int i=0;i<nums.length;i++){
if (map.containsKey(target-nums[i])){
return new int[]{map.get(target-nums[i]),i};
}
map.put(nums[i],i);
}
return new int[0];
}
}