# 给定一个列表和一个整数,设计算法找到两个数的下标,使得两个数之和为给定的整数,保证肯定仅有一个结果.
# 例:列表li=[0, 1, 2, 3, 4, 5, 6]与目标整数6,结果为{0: 6, 1: 5, 2: 4, 3: 3}.
li = [0, 1, 2, 3, 4, 5, 6]
# 解法1:
def two_sum_1(li, target):
for i in range(len(li)):
for j in range(i + 1, len(li)):
if li[i] + li[j] == target:
return i, j
print(two_sum_1(li, 6))
# 解法2
def two_sum_2(li, target):
d = {}
for i in range(len(li)):
b = target - li[i]
if b in d:
return d[b], i
else:
d[li[i]] = i
print(two_sum_2(li, 6))
# 解法3
# 结合二分查找法,可以找到所有的可能组合.
# 缺点:提供的列表必须是有序的,否则这个办法没有作用.
class Solution:
# 二分查找法
def binary_search(self, li, val, start, end):
while start <= end:
mid = (start + end) // 2
if li[mid] < val:
start = mid + 1
elif li[mid] > val:
end = mid - 1
else:
return mid
else:
return None
# 给定一个列表和一个整数,设计算法找到两个数的下标,使得两个数之和为给定的整数.
def two_sum3(self, li, target):
dic = {}
for i in range(len(li)):
a = li[i]
b = target - a
# 写0时,{0: 6, 1: 5, 2: 4, 3: 3, 4: 2, 5: 1, 6: 0}
# 写i时,{0: 6, 1: 5, 2: 4, 3: 3}
# 写i+1时,{0: 6, 1: 5, 2: 4}
res = self.binary_search(li, b, i, len(li) - 1)
if res != None:
dic[i] = res
return dic
# 实例化对象
s = Solution()
# 调用类方法
print(s.two_sum3(li, 6))