1. 程式人生 > >LeetCode Two Sum II

LeetCode Two Sum II

Problem

Given an array of integers that is already sorted in ascending order, find two numbers such that they add up to a specific target number.

The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.

You may assume that each input would have exactly one solution and you may not use the same element twice.

Input: numbers={2, 7, 11, 15}, target=9 Output: index1=1, index2=2

即找到陣列中兩個元素的和等於給定數字的元素,陣列已排序。

Python 實現


# Given an array of integers that is already sorted in ascending order, find two numbers such that they add up to a specific target number.
# # The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based. # # You may assume that each input would have exactly one solution and you may not use the same element twice.
# # Input: numbers={2, 7, 11, 15}, target=9 # Output: index1=1, index2=2 # author li.hzh class Solution: def twoSum(self, numbers, target): """ :type numbers: List[int] :type target: int :rtype: List[int] """ map = {} index = 1 for val in numbers: other = target - val if other in map: return [map.get(other), index] map[val] = index index += 1 def twoSum_without_extra_space(self, numbers, target): """ :type numbers: List[int] :type target: int :rtype: List[int] """ head, tail = 0, -1 cur_sum = numbers[head] + numbers[tail] while cur_sum != target: if cur_sum < target: head += 1 else: tail -= 1 cur_sum = numbers[head] + numbers[tail] return [head + 1, len(numbers) + tail + 1]

分析

這裡也做了兩個解法,解法1,是通用解法。即,不關心陣列中元素的排列規律,藉助一個map來尋找成對的元素。

但是,題目明確說明陣列中的元素已排序,那麼顯然是有特殊的解法。即解法二,通過首尾元素相加,與給定值比較。如果小於給定元素,顯然只能首指標向後移位,再相加比較。如果大於則尾指標前移。每次比較後,都是明確的單向移動,直到最終找到匹配結果。