剑指offer 42. 和为s的两个数字

原题

输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。

输出描述:

对应每个测试案例,输出两个数,小的先输出。

Reference Answer

思路分析

设定两个指针,一个指向数组的起点,一个指向数组的终点,然后对两个数字求和,如果和大于目标值,则把后一个指针前移,如果和小于目标值,则把前一个指针后移。两个指针交汇的时候如果还没找到,就终止操作。

# -*- coding:utf-8 -*-
class Solution:
    def FindNumbersWithSum(self, array, tsum):
        # write code here
        if len(array) <= 1:
            return []
        left, right = 0, len(array) - 1
        temp_res, res = [], []
        temp_res = {}
        while array[left] < array[right]:
            if array[left] + array[right] < tsum:
                left += 1
            elif array[left] + array[right] == tsum:
                index = array[left] * array[right]
                temp_res[index] = [array[left], array[right]]
                left += 1
            elif array[left] + array[right] > tsum:
                right -= 1
        if not temp_res:
            return []
        res = sorted(temp_res.items(), key=lambda temp_res:temp_res[0])
        return res[0][1]
        

猜你喜欢

转载自blog.csdn.net/Dby_freedom/article/details/84452037