# 给定一个列表和一个整数,设计算法找到两个数的下标,使得两个数之和为给定的整数,保证肯定仅有一个结果.
# :列表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))