牛客网-和为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 []