|  | 
 
 发表于 2020-7-29 19:18:31
|
显示全部楼层 
| 你两个for去暴力破题,真的好吗?  
 
 复制代码def hash(numbers, target):
    """哈希表,不多赘述"""
    dct = {}
    for idx, val in enumerate(numbers):
        if val in dct:
            return [dct[val] + 1, idx + 1]
        dct[target - val] = idx
def double_pointer(numbers, target):
    # TODO {
    #      如果numbers[left] + numbers[right] > target,由于是已经排序好的。所以 right - 1。直到指针重叠
    #        反之 numbers[left] + numbers[right] < target,  left + 1 。
    #  }
    left, right = 0, len(numbers) - 1
    while numbers[left] + numbers[right] != target:
        if numbers[left] + numbers[right] > target:
            right -= 1
        else:
            left += 1
    return [left + 1, right + 1]
def two_points(numbers, target):
    # TODO {
    #      我们需要找两个数,numbers[i] 以及在numbers[i]右侧的 target - numbers[i]
    #        我们遍历数组需要O(n),二分查找一个值需要O(log_n), 最终耗时O(nlogn)
    #  }
    length = len(numbers)
    for index, value in enumerate(numbers):
        _ = index
        while _ < length:
            mid = (_ + length) >> 1
            number = numbers[mid]
            if number > target - value:
                length = mid
            elif number < target - value:
                _ = mid + 1
            else:
                return [index + 1, mid + 1]
 | 
 |