167. Two Sum II - Input array is sorted

题目描述

给出一个升序排列好的整数数组,找出2个数,它们的和等于目标数。返回这两个数的下标(从1开始),其中第1个下标比第2个下标小。

Input: numbers={2, 7, 11, 15}, target=9 Output: index1=1, index2=2假定只有一个正确答案。

我的解法/简便解法——双指针

  • 题目说了数组是排序的,这样难度就降低了。由于数组是升序排列,所以两个数之和sum为目标值target,则肯定是小的数在前,大的数在后,这样明显是双指针的问题。
  • n的复杂度。
  • 结果:beat 39.53%
class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int i = 0,j = numbers.length - 1;
        int[] res = new int[2];
        while(i < j){
            int now = numbers[i] + numbers[j];
            if(now > target)
                j--;
            else if(now < target)
                i++;
            else{
                res[0] = i + 1;
                res[1] = j + 1;
                return res;
            }
            
        }
        return res;
    }
}

其他解法——哈希

  • 利用字典,同leetcode第1题
  • 复杂度为n
def twoSum2(self, numbers, target):
    dic = {}
    for i, num in enumerate(numbers):
        if target-num in dic:
            return [dic[target-num]+1, i+1]
        dic[num] = i

其他解法——二分查找

  • 固定一个数字,然后对另一个数字进行二分查找
  • 时间复杂度O(n)
def twoSum(self, numbers, target):
    investigatedSoFar = []
    for i in range(len(numbers)):
        if not numbers[i] in investigatedSoFar:
            investigatedSoFar.append(numbers[i])
            l, r = i + 1, len(numbers) - 1
            tmp = target - numbers[i]
            while l <= r:
                mid = l + (r-l) // 2
                if numbers[mid] == tmp:
                    return([i + 1, mid + 1])
                elif numbers[mid] < tmp:
                    l = mid + 1
                else:
                    r = mid - 1