leetcode笔记--167.有序数组和等于给定值

这道题的有两种解法,算法复杂度不同。

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]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值