题目
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
说明:
返回的下标值(index1 和 index2)不是从零开始的。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例:
输入: numbers = [2, 7, 11, 15], target = 9
输出: [1,2]
解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路1 56ms
使用哈希表存储hashtable[v] = index .
每次查找差值是否在表中。
这里使用了enumerate(list, start = 1)。
代码
class Solution(object):
def twoSum(self, numbers, target):
"""
:type numbers: List[int]
:type target: int
:rtype: List[int]
"""
hashtable = {}
for i, v in enumerate(numbers, 1):
temp = target - numbers[i-1]
if temp in hashtable:
return [hashtable[temp], i]
else:
hashtable[v] = i
解题思路2 92ms
使用二分查找每次查找差值的坐标。这种做法比较复杂,而且较慢。
代码
class Solution(object):
def twoSum(self, numbers, target):
"""
:type numbers: List[int]
:type target: int
:rtype: List[int]
"""
def get_index(nums, target, index1):
left, right = 0, len(nums)-1
while left <= right:
mid = left + (right-left)/2
if nums[mid] == target:
if mid == index1:
return mid+1
else:
return mid
elif nums[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
for i in range(len(numbers)):
index1 = i
index2 = get_index(numbers, target-numbers[i], index1)
if index2 != -1 and index1 != index2:
return [index1+1, index2+1]
网友评论