给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解题思路:1,由于要找到符合题意的数组元素的下标,所以先要将原来的数组深拷贝一份,然后排序。
2,然后在排序后的数组中找两个数使它们相加为target。这个思路比较明显:使用两个指针,一个指向头,一个指向尾,两个指针向中间移动并检查两个指针指向的数的和是否为target。如果找到了这两个数,再将这两个数在原数组中的位置找出来就可以了。
3,要注意的一点是:在原来数组中找下标时,需要一个从头找,一个从尾找,要不无法通过。如这个例子:numbers=[0,1,2,0]; target=0。如果都从头开始找,就会有问题。
以下是我写的:
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
n = len(nums) #得到nums的长度
for x in range(0,n):
a = target - nums(x)
if a in nums:
y = nums.index(a)
if x == y:
continue
else:
return x,y
break
else:
continue
大神解题:
class Solution:
# @return a tuple, (index1, index2)
def twoSum(self, num, target):
index = []
numtosort = num[:]; numtosort.sort()
i = 0; j = len(numtosort) - 1
while i < j:
if numtosort[i] + numtosort[j] == target:
for k in range(0,len(num)):
if num[k] == numtosort[i]:
index.append(k)
break
for k in range(len(num)-1,-1,-1):
if num[k] == numtosort[j]:
index.append(k)
break
index.sort()
break
elif numtosort[i] + numtosort[j] < target:
i = i + 1
elif numtosort[i] + numtosort[j] > target:
j = j - 1
return (index[0]+1,index[1]+1)
以上代码太冗长了,如果使用dict也就是哈希,就会简洁很多。
class Solution:
# @return a tuple, (index1, index2)
def twoSum(self, num, target):
dict = {}
for i in xrange(len(num)):
x = num[i]
if target-x in dict:
return (dict[target-x]+1, i+1)
dict[x] = i
换一种思路
代码思路:这个算法的核心思想是构造一个字典,字典用来存储当前元素完成target需要的元素值作为key,当前元素的index作为value。然后遍历过程中进行判断,当前元素是不是属于我想要的元素,是的话,直接输出 [字典中该元素的下标,当前遍历元素下标]
思考:这个算法快在哪里?
从时间复杂度的角度来看,第一层for循环是O(n),字典采用的是hash函数的结构,所以在 x in dict的查找过程中,时间复杂度为O(1),而这里没用到index查询,而是直接获取value值,而字典的Get Item的复杂度也是O(1),所以整个算法的时间复杂度为O(n),不过这里的空间复杂度是O(n),用空间换时间。
class Solution(object):
def twoSum(self, nums, target):
nums_dict = {}
for i, num in enumerate(nums):
if num in nums_dict:
return [nums_dict[num], i]
else:
nums_dict[target - num] = i