简单18输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
输入:nums = [2,7,11,15], target = 9
输出:[2,7] 或者 [7,2]
双指针 时间复杂度是O(N)
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
if not nums or len(nums) < 2:
return
start = 0
end = len(nums)-1
while start < end:
s = nums[start] + nums[end]
if s < target:
start += 1
elif s > target:
end -= 1
else:
return [nums[start], nums[end]]
return
二分 二分的时间复杂度是 NlogN
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
从左往右,并且用二分查找
"""
def divide(nums, target):
if not nums:
return
max = len(nums)-1
min = 0
while min <= max:
mid = (min + max)//2
if target > nums[mid]:
min = mid+1
elif target < nums[mid]:
max = mid-1
else:
return nums[mid]
return
for i in range(0, len(nums)):
if nums[i] + nums[-1] < target:
continue
else:
if divide(nums, target-nums[i]):
return [nums[i], target-nums[i]]
return []