您的位置:首页 > 其它

LeetCode每日一题--两数之和II-输入有序数组

2020-03-15 18:21 295 查看

  【前言】坚持日更LeetCode刷题系列

    不积跬步,无以至千里;不积小流,无以成江海。愿与诸君共勉!


  【题目】136.只出现一次的数字

    题目描述:给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函
数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。

    说明:

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


    示例:

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

    

思路一:
首先,我们还是来用暴力求解的方法来思考此题。具体步骤如下:
         1.建立两个循环来遍历数组
         2.如果两个index不相等(排除相同的数相加)并且对应index下的数相加为target,则返回列表。
         具体代码如下:

class Solution(object):
def twoSum(self, numbers, target):
"""
:type numbers: List[int]
:type target: int
:rtype: List[int]
"""
result_list = []
for i in range(len(numbers)):
for j in range(len(numbers)):
if(i!=j and numbers[i]+numbers[j]==target):
result_list.append(i+1)
result_list.append(j+1)
return result_list

    运行结果:出现了

超时
错误,采用两层循环的方式,时间复杂度为O(n^2),因此对于过长的列表时,会出现超时的现象。


    

思路二:
可参考我这篇中利用字典存储,模拟哈希表解决此题。具体代码如下:

class Solution(object):
def twoSum(self, numbers, target):
"""
:type numbers: List[int]
:type target: int
:rtype: List[int]
"""
hashmap = {}      #因为我们想得到index,所以我们将num作为键
for index,num in enumerate(numbers):
another_num = target - num
if(another_num in hashmap):
return [hashmap[another_num]+1,index+1] #注意return时两个index的顺序
else:
hashmap[num] = index
return None

    运行结果:
    

    

思路三:
很显然官方是不会出两个一样的题的,那么题目中还有一个重点标记的条件
升序排列
,那么我们应该如何去利用这个条件呢?我首先想到的是二分查找的方式,并且在题解中看到了一个前辈的关于二分详细的思考,于是直接引出大佬链接就好了,有兴趣的朋友可以去了解下。


    关于其中一些知识的链接:
    二分姿势

    分享就到这里了,欢迎大家一起交流讨论。


    

注明

    题目来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted

  • 点赞 1
  • 收藏
  • 分享
  • 文章举报
Mingw_ 发布了36 篇原创文章 · 获赞 64 · 访问量 2766 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: