剑指Offer_编程题:和为s的两个数字

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

我就是挨个循环的。。。。而且我觉得这个数组是有序的,所以前两个数字就是乘积最小的。。。。

# -*- coding:utf-8 -*-
class Solution:
    def FindNumbersWithSum(self, array, tsum):
        # write code here
        if not len(array):
            return []
        length = len(array)
        print(length)
        pst = []
        for i in range(length-1):
            for j in range(i+1, length):
                if array[i] + array[j] == tsum:
                    pst.append(array[i])
                    pst.append(array[j])
        
        print(pst)

        if len(pst) == 0:
            return []

        return pst[:2]

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

# -*- coding:utf-8 -*-
class Solution:
    def FindNumbersWithSum(self, array, tsum):
        # write code here
        if array == None or len(array) <= 0 or array[-1] + array[-2] < tsum:
            return []
        start = 0
        end = len(array) - 1
        while start < end:
            if array[start] + array[end] < tsum:
                start += 1
            elif array[start] + array[end] > tsum:
                end -= 1
            else:
                return [array[start], array[end]]
        return []

猜你喜欢

转载自blog.csdn.net/mengmengdajuanjuan/article/details/81170996