剑指offer-42.和为S的两个数字-python

42.和为S的两个数字

题目描述

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

输出描述:

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

记录

方法一:
array = [1,2,3,4,5,6,7,8,9]
tsum = 10
[1,9] [2,8] [3,7] [4,6] —>[1,9]
两个数相差越大,乘积越小。
双指针,一前一后,找到的第一对,就是最后的两个数。
1.left开头,right指向结尾
2.如果和小于sum,说明太小了,left右移寻找更大的数
3.如果和大于sum,说明太大了,right左移寻找更小的数
4.和相等,把left和right的数返回

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

方法二:
双重循环。
找到的第一对就是所求的两个数。

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

方法三:
讨论中看见的。有意思。时间复杂度太高。

def FindNumbersWithSum(self, array, tsum):
        couple = [tsum-i for i in array]
        filtarray = [i for i in array if i in couple]
        try:
            return [filtarray[0],filtarray[-1]]
        except:
            return []

你可能感兴趣的:(剑指offer)