题目:
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
C解答:
简单粗暴的双层循环:
int* twoSum(int* nums, int numsSize, int target) {
static int a[2];
int i,j;
for(i=0;i<numsSize;i++)
{
for(j=i+1;j<numsSize;j++)
{
if(nums[i]+nums[j]==target)
{
a[0]=i;
a[1]=j;
}
}
}
return a;
}
Python解答:
方法1:简单粗暴的双层循环,这是最容易想到的方法,但是无法通过时间复杂度检验。此处略。
方法2:算出target-nums[i],再查算出的该值是否存在于nums中,存在:查索引;不存在:下一个。此方法的时间复杂度明显低于方法一。
代码:
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
answer=[]
for i in range(0,len(nums)):
a=target-nums[i]
if a in nums:
j=nums.index(a)
if i==j:
continue
else:
answer.append(i)
answer.append(j)
break
return answer
方法3:百度之后发现了一个更优解,创建一个字典,通过循环把 target - nums[x]作为键,x作为值存入字典,边存边检查当前正在处理的nums[x]是否存在于字典中,存在:返回字典中nums[x]的值,和当前正在使用的x的值。
此方法的时间复杂度优于方法2。
代码:
class Solution:
def twoSum(self,nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
n = len(nums)
d = {}
for x in range(n):
a = target - nums[x]
if nums[x] in d:
return d[nums[x]],x
else:
d[a] = x