|
发表于 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]
复制代码 |
|