概述
这道题的有两种解法,算法复杂度不同。
1、O(n)
第一种方法需要用到双指针,算法好理解,需要low和high指针,分别指向numbers[0]和numbers[len(numbers)-1],即一个指向头(最小值)、一个指向尾(最大值)。计算两者指针所指向的值的和sum,将sum和给定的target作比较。如果sum>target则说明需要向小的和去查找,则将high向值较小的方向移动,即high-=1;如果sum<target则说明需要向大的和去查找,则将low向值较大的方向移动,即low+=1。循环的终止条件是low<high。
class Solution(object):
def twoSum(self, numbers, target):
n = len(numbers)
low, high = 0, n-1
while low<high:
sum = numbers[low] + numbers[high]
if sum == target:
return [low+1, high+1]
elif sum < target:
low+=1
else:
high-=1
return [-1, -1]
2、O(nlgn)
想要在降低算法的复杂度,就要想办法减少算法执行时的运算次数,这里采用二分法来“砍掉”一些繁琐的查找步骤。
具体思想是,每次循环先“确定”一个数字(如numbers=[2,7,11,15],先确定下numbers[0]=2),之后在剩下的数字中(numbers[1]~numbers[3])采用二分查找的方法来找另一个数,降低复杂度 。仍需要两个指针low和high,分别指向确定的数的下一位和尾,二分法的思想是,先找到中间的数(numbers[mid]),由于另一个数的值为target-numbers[0],则在接下来的查找中就是比较中间值和target-numbers[0]的大小。如果numbers[mid]>target-numbers[0],则表示要找的数比numbers[mid]小,在左边,移动high=mid-1;如果numbers[mid]<target-numbers[0],则表示要找的数比numbers[mid]大,在右边,移动low=mid+1。终止条件是low<=high。
class Solution(object):
def twoSum(self, numbers, target):
n = len(numbers)
for i in range(n):
low, high = i+1, n-1
while low <= high:
mid = (low + high)//2
if numbers[mid] == target-numbers[i]:
return [i+1, mid+1]
elif numbers[mid] > target-numbers[i]:
high = mid-1
else:
low = mid+1
return [-1, -1]
最后
以上就是仁爱毛豆为你收集整理的leetcode笔记--167.有序数组和等于给定值的全部内容,希望文章能够帮你解决leetcode笔记--167.有序数组和等于给定值所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复