167. Two Sum II

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.

Note:

  • 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.

Example:

Input: numbers = [2,7,11,15], target = 9
Output: [1,2]
Explanation: The sum of 2 and 7 is 9. Therefore index1 = 1, index2 = 2.
 

来自 <https://leetcode.com/problems/two-sum-ii-input-array-is-sorted/description/>

思路1:最简单直接的做法 

 1 class Solution(object):
 2     def twoSum(self, numbers, target):
 3         """
 4         :type numbers: List[int]
 5         :type target: int
 6         :rtype: List[int]
 7         """
 8         length = len(numbers)
 9         for i in range(length):
10             for j in range(1,length-i):
11                 if numbers[i] + numbers[i + j] == target:
12                     return i + 1, i + j + 1

思路2: 发现上面的做法将会超时,问题出现在最后一个测试样例,最后一个测试样例有许多重复样本,考虑先去除重复样本,减小计算花费

 1 class Solution(object):
 2     def twoSum(self, numbers, target):
 3         """
 4         :type numbers: List[int]
 5         :type target: int
 6         :rtype: List[int]
 7         """
 8         new_numbers = []
 9         counts = []
10         for i in numbers:
11             if new_numbers in new_numbers:
12                 counts[-1] += 1
13             else:
14                 new_numbers.append(i)
15                 counts.append(1)
16 
17         length = len(new_numbers)
18         for i in range(length):
19             for j in range(1, length - i):
20                 if new_numbers[i] + new_numbers[i + j] == target:
21                     pos_1 = pos_2 = 1
22                     for k in range(i):
23                         pos_1 += counts[k]
24                     for q in range(i + j):
25                         pos_2 += counts[q]
26                     return pos_1, pos_2

思路3:以上做法还是会超时,对于每个选中的元素,改用二分查找的做法查找另一个相加数

 1 class Solution(object):
 2     def twoSum(self, numbers, target):
 3         """
 4         :type numbers: List[int]
 5         :type target: int
 6         :rtype: List[int]
 7         """
 8         length = len(numbers)
 9         for i in range(length):
10             p = i
11             q = length
12             while q - p > 1:
13                 mid = (p + q) // 2
14                 if numbers[i] + numbers[mid] == target:
15                     return i + 1, mid + 1
16                 elif numbers[i] + numbers[mid] < target:
17                     p = mid
18                 else:
19                     q = mid

思路4:使用两个坐标,朝中间遍历

 1 class Solution(object):
 2     def twoSum(self, numbers, target):
 3         """
 4         :type numbers: List[int]
 5         :type target: int
 6         :rtype: List[int]
 7         """
 8         length = len(numbers)
 9         i = 0
10         j = length - 1
11         while j - i >= 1:
12             if numbers[i] + numbers[j] == target:
13                 return i + 1, j + 1
14             elif numbers[i] + numbers[j] < target:
15                 i = i + 1
16             else:
17                 j = j - 1
原文地址:https://www.cnblogs.com/Thinker-pcw/p/9501030.html