牛客网-和为S的两个数字

题目描述

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

输出描述:

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

解决代码:自己想的有点麻烦和复杂化了,有一个规律是两个数距离越远乘积越小。
# -*- coding:utf-8 -*-
#递增序列
#查找和为某个值的两个数
#思路:进行二分查找(找到和这个值最相近的数),一步一步缩小查找的范围。
class Solution:
    def FindNumbersWithSum(self, array, tsum):
        # write code here
        left = 1
        right = len(array)-1
        result = []
        multi = float('inf')
        last = 0
        for num in array:
            if left>right:
                continue
            index = self.byteFind(array,left,right,tsum-num)
            if num+array[index]==tsum and num*array[index]<multi:
                    multi = num*array[index]
                    result.append([num,array[index]])
            left += 1
            right = index
        return result[-1] if len(result)!=0 else []
    def byteFind(self,array,left,right,target):
        if left>right:
            return right
        mid = (left+right)//2
        if array[mid]>target:
            return self.byteFind(array,left,mid-1,target)
        elif array[mid]<target:
            return self.byteFind(array,mid+1,right,target)
        else:
            return mid

进阶:

数列满足递增,设两个头尾两个指针i和j, 
若ai + aj == sum,就是答案(相差越远乘积越小) 
若ai + aj > sum,aj肯定不是答案之一(前面已得出 i 前面的数已是不可能),j -= 1 
若ai + aj < sum,ai肯定不是答案之一(前面已得出 j 后面的数已是不可能),i += 1 
O(n)
class Solution:
    def FindNumbersWithSum(self, array, tsum):
        # write code here
        left,right = 0,len(array)-1
        while(left<right):
            if array[left]+array[right]<tsum:
                left += 1
            elif array[left]+array[right]>tsum:
                right -= 1
            else:
                return [array[left],array[right]]
        return []
posted @ 2020-01-04 15:03  ditingz  阅读(216)  评论(0编辑  收藏  举报