给定一个数组和一个target数字,找到数组中加起来等于target的两个数,并返回他们的索引。 假定答案是唯一的,并且不允许两个数的索引是相同的。
In [22]:
def twoSum(nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
i = 0
nums_len = len(nums)
j = nums_len - 1
nums_sorted = sorted(nums)
while i < j:
sum = nums_sorted[i] + nums_sorted[j]
if sum < target:
i += 1
elif sum > target:
j -= 1
else:
ii = nums.index(nums_sorted[i])
if nums_sorted[i] == nums_sorted[j]:
nums.pop(ii)
j = nums.index(nums_sorted[j]) + 1
else:
j = nums.index(nums_sorted[j])
return min(ii, j), max(ii, j)
将数组nums的index记录起来,然后一起排序,根据加和移动i,j指针,最后注意返回的参数是有顺序的
In [7]:
def twoSum(nums, target):
a = list()
nums_len = len(nums)
for i in range(nums_len):
a.append([nums[i], i])
a = sorted(a, key=lambda a: a[0])
i = 0
j = nums_len - 1
while i < j:
sum = a[i][0] + a[j][0]
if sum == target:
return [a[i][1], a[j][1]] if a[i][1] < a[j][1] else [a[j][1], a[i][1]]
elif sum < target:
i += 1
else:
j -= 1
In [8]:
nums = [3, 3]
print(twoSum(nums, 6))
In [15]:
class Solution(object):
def twoSum(self, nums, target):
"""
将已经看到的内容放进篮子里面,并记录其index,
每次查找篮子里面没有对应的值。
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
lookup = {}
for i, num in enumerate(nums):
if target - num in lookup:
return [lookup[target - num], i]
lookup[num] = i
print(lookup)
return []
def twoSum2(self, nums, target):
"""
每次都查找当前查找值的后面的值,前一个方法是向后查找,
这个方法是向前查找。
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
k = 0
for i in nums:
j = target - i
k += 1
tmp_nums = nums[k:]
print(tmp_nums)
if j in tmp_nums:
return [k - 1, tmp_nums.index(j) + k]
In [16]:
Solution().twoSum2((3, 2, 7, 3), 6)
Out[16]:
这两个方法hen