LeetCode167-两数之和II-输入有序数组

又是好久没更新了

真的是有些罪过啊

最近早上都在学游泳

天天早上5点半起床

然后从6点游到7点半

可气的是,还没有学会换气

后面真的要抓紧了啊


167-两数之和II-输入有序数组

给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。

函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。

说明:

返回的下标值(index1 和 index2)不是从零开始的。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。

示例:

输入: numbers = [2, 7, 11, 15], target = 9
输出: [1,2]
解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。

思路

这题我觉得和第一题-两数之和没什么两样,只不过这题的返回形式是下标值加1了。

对第一题不是很熟悉的朋友可以先看看我之前写的这篇文章。

https://blog.youkuaiyun.com/weixin_36431280/article/details/88405249

这题我也用两种方法来解答

方法一:暴力搜索法

这种方法肯定是最简单直接的了,定义两个指针从头至尾依次遍历,即可得出答案。

代码如下

class Solution(object):
    # 此种方法属于暴力法,定义两个指针依次遍历
    def twoSum(self, numbers, target):
        """
        :type numbers: List[int]
        :type target: int
        :rtype: List[int]
        """
        # 定义一列表专门用来保存结果集
        index_list = []
        for start in range(len(numbers)):
            for end in range(start+1, len(numbers)):
                if numbers[start]+numbers[end] == target:
                    index_list.extend([start+1, end+1])
                    break
        return index_list
        

if __name__ == "__main__":
    numbers = [2, 7, 11, 15]
    target = 9
    index_list = Solution().twoSum(numbers, target)
    print(index_list)

暴力法有两种形式,另一种形式是:不需要定义两个指针,只移动第一个指针,用target-numbers[start]判断其是否在numbers[start+1:]中即可。

代码如下

class Solution(object):
    # 此种方法属于暴力法
    def twoSum(self, numbers, target):
        """
        :type numbers: List[int]
        :type target: int
        :rtype: List[int]
        """
        # 定义一列表专门用来保存结果集
        index_list = []
        for start in range(len(numbers)):
            next_num = target - numbers[start]
            if next_num in numbers[start+1:]:
                end = numbers[start+1:].index(next_num)+start+1
                index_list.extend([start+1, end+1])
        return index_list
        

if __name__ == "__main__":
    numbers = [2, 7, 11, 15]
    target = 9
    index_list = Solution().twoSum(numbers, target)
    print(index_list)

不过这两种方法的执行效率你懂得,只要是暴力法基本上都是超过时间限制了。写出来主要是为了不让大家走同样的坑。

方法二:双指针两端逼近法

这种方法的名字是我这位天才自己取得,怎么样,牛逼吧!哈哈哈哈哈哈哈哈哈哈。一般暴力法的时间复杂度都是O(n^2),即两次循环遍历,如果我只用一次遍历,那执行效率肯定会降下来。这种方法就是这样:分别定义两个指针指向数组numbers的首尾两端,分别向中间移动,直至找出符合要求的结果。

代码如下

class Solution(object):
    # 双指针从两端往中间逼近
    def twoSum(self, numbers, target):
        """
        :type numbers: List[int]
        :type target: int
        :rtype: List[int]
        """
        # 定义一列表专门用来保存结果集
        index_list = []
        # 分别定义首尾指针
        start = 0
        end = len(numbers)-1
        while start<end:
            if numbers[start] + numbers[end] == target:
                index_list.extend([start+1, end+1])
                break
            elif numbers[start] + numbers[end] > target:
                end -= 1
            else:
                start += 1
        return index_list
        

if __name__ == "__main__":
    numbers = [2, 7, 11, 15]
    target = 9
    index_list = Solution().twoSum(numbers, target)
    print(index_list)

执行效率还算不错,在80%左右。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习的学习者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值