题目描述:
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum
方法一:
思路:将列表nums从小到大排序,首项与末项的和与target比较,当其和比target大时,首项不动,末项指向倒数第二个数;当其和比target小时,首项指向第二个数,末项不动;当其和等于target时,返回首项末项此时的位置(此时找到的位置并不对应原列表中的位置)。递归,找到这两数为止。后在原列表中找到这两个数。
注意:在原列表中查询数时,我所使用的是list.index(),其只找数第一次出现的位置,如果所要找的两个数相等,就会失败。解决方法是利用list.index()可以设置起始查询位置的功能,将第一次出现的位置设为起始位置即可。
上代码:
class Solution:
def com(self,i,j,c,target):
sum=c[i]+c[j]
if sum >target:
j=j-1
if sum<target:
i=i+1
if sum != target:
return self.com(i,j,c,target)
if sum == target:
return [i,j]
def twoSum(self, nums: List[int], target: int) -> List[int]:
c=sorted(nums)
i=0
j=len(c)-1
d=self.com(i,j,c,target)
if c[d[0]]!=c[d[1]]:
return [nums.index(c[d[0]]),nums.index(c[d[1]])]
else:
return [nums.index(c[d[0]]),nums.index(c[d[1]],nums.index(c[d[0]])+1)]
此法运行时间快:只有32ms 缺点是占内存较高是24.6MB
方法二:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in nums:
d=target-i
if d in nums[nums.index(i)+1:]:
if d != i:
return([nums.index(i),nums.index(d)])
if d==i:
return ([nums.index(i),nums.index(d,nums.index(i)+1)])
else:
continue
容易理解,使用了列表切片,时间消耗大。