剑指 Offer 57. 和为s的两个数字https://leetcode.cn/problems/he-wei-sde-liang-ge-shu-zi-lcof/
首先暴力肯定就是遍历每个数
第一种方法双指针:
i,j=0,len(nums)-1
如果,num[i]+num[j]>target
执行j=j-1,这时候(i+1,j)指nums[i+1]+nums[j],(i+1,j),(i+2,j),...,(j-1,j)会丢失,以后,再也没有这些值
因为列表是递增的,num[i]+num[j]>target,那么这些丢失的也大于target,所以丢失没影响,这些值本来也不满足
如果,num[i]+num[j]<target
执行i=i+1,这时候(i,j-1),(i,j-2),..(i,i+1)会丢失,同样的这些丢失的值的和也小于target,
所以丢失没影响,这些值本来也不满足
二分法就是对每个数,二分去找后面的数和它求和
'''
#超时
class Solution:
def twoSum(self, nums, target):
for i in range(len(nums)):
if nums[i]>=target:
break
for j in range(i+1,len(nums)):
if nums[i]+nums[j]==target:
return [nums[i],nums[j]]
if nums[i]+nums[j]>target:
break
'''
'''
双指针
class Solution:
def twoSum(self, nums, target):
i,j=0,len(nums)-1
while i<j:
if nums[i]+nums[j]>target:
j-=1
elif nums[i]+nums[j]<target:
i+=1
else:
return [nums[i],nums[j]]
'''
class Solution:
def twoSum(self, nums, target):
for i in range(len(nums)):
left=i+1
right=len(nums)-1
while left<=right:
mid=(left+right)//2
if nums[mid]+nums[i]>target:
right=mid-1#写成mid超时
elif nums[mid]+nums[i]<target:
left=mid+1#写成mid超时
else:
return [nums[i],nums[mid]]
a=Solution()
nums = [2,7,11,15]
target = 9
print(a.twoSum(nums,9))