题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
返回值描述:
对应每个测试案例,输出两个数,小的先输出。
示例
输入 [1,2,4,7,11,15],15
返回值 [4,11]
知识点回顾
数学、数组、双指针
代码
解法一:暴力解题,双重循环,时间复杂度:O(n^2)
# -*- coding:utf-8 -*- class Solution: def FindNumbersWithSum(self, array, tsum): # write code here lenth=len(array) for i in range(lenth): for j in range(i+1,lenth): if array[i]+array[j]==tsum: try: if array[i]*array[j]<a*b: a=array[i] b=array[j] except: a=array[i] b=array[j] try: return [a,b] except: return []
解法二:双指针,时间复杂度:O(n)
因为数组是有序的,所以可以用双指针,指向数组的首尾,具体步骤如下:
1.初始化:指针i指向数组首, 指针j指向数组尾部
2. 如果arr[i] + arr[j] == sum , 说明是可能解,同时++i、--j寻找下一组
3. 否则如果arr[i] + arr[j] > sum, 说明和太大,所以--j
4. 否则如果arr[i] + arr[j] < sum, 说明和太小,所以++i
# -*- coding:utf-8 -*- class Solution: def FindNumbersWithSum(self, array, tsum): # write code here lenth=len(array) i,j=0,lenth-1 while i<j: tmp=array[i]+array[j] if tmp==tsum: try: if array[i]*array[j]<a*b: a=array[i] b=array[j] except: a=array[i] b=array[j] i+=1 j-=1 elif tmp<tsum: i+=1 else: j-=1 try: return [a,b] except: return []