输入一个升序数组 array 和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,返回任意一组即可,如果无法找出这样的数字,返回一个空数组即可。
数据范围:
,
[1,2,4,7,11,15],15
[4,11]
返回[4,11]或者[11,4]都是可以的
[1,5,11],10
[]
不存在,返回空数组
[1,2,3,4],5
[1,4]
返回[1,4],[4,1],[2,3],[3,2]都是可以的
[1,2,2,4],4
[2,2]
# -*- coding:utf-8 -*- class Solution: def FindNumbersWithSum(self, array, tsum): # write code here if len(array)<2: return [] res=[] n=len(array) for i in range(n-1): for j in range(i+1,n): if array[i]+array[j]==tsum: res.append([array[i],array[j]]) if len(res)==0: return [] thre=res[0][0]*res[0][1] out=res[0] for item in res: if item[0]*item[1]<thre: thre=item[0]*item[1] out=item return out
# -*- coding:utf-8 -*- class Solution: def FindNumbersWithSum(self, array, tsum): # write code here results = [] for i in range(len(array)-1): for j in range(i+1,len(array)): if array[i]+array[j]==tsum: temp = [] temp.append(array[i]) temp.append(array[j]) if temp not in results: results.append(temp) if len(results)==0: return results elif len(results)==1: return results[0] else: multi = [] for res in results: multi.append(res[0]*res[1]) idx = multi.index(min(multi)) return results[idx]
# # -*- coding:utf-8 -*- # """ # 思路1:用hash数组,看差值在不在数组中,在的话再比较乘积的大小; # """ # class Solution: # def FindNumbersWithSum(self, array, tsum): # if len(array) == 0: # return [] # hash = {} # m,n,min = 0,0,array[len(array)-1]*array[len(array)-1] # for i,num in enumerate(array): # hash[num] = i # for i,num in enumerate(array): # j = hash.get(tsum-num) # if j is not None and i != j: # res = num*array[j] # if (res<min): # min = res # m = array[i] # n = array[j] # # 没找到两个元素和为目标值; # if m == 0 & n == 0: # return [] # return [m,n] # """ # 思路2:优化思路1的遍历部分,但是影响好像不大,hhhh; # """ # class Solution: # def FindNumbersWithSum(self, array, tsum): # if len(array) == 0: # return [] # hash = {} # m,n,min = 0,0,array[len(array)-1]*array[len(array)-1] # for i,num in enumerate(array): # hash[num] = i # for i,num in enumerate(array): # # 优化部分 # if i <= len(array) // 2: # j = hash.get(tsum-num) # if j is not None and i != j: # res = num*array[j] # if (res<min): # min = res # m = array[i] # n = array[j] # # 没找到两个元素和为目标值; # if m == 0 & n == 0: # return [] # return [m,n] # """ # 思路3:hash,不用比较乘积的大小,因为递增数组有a[0]*a[n]<=a[1]*a[n-1]; # """ # class Solution: # def FindNumbersWithSum(self, array, tsum): # if len(array) == 0: # return [] # hash = {} # for i,num in enumerate(array): # hash[num] = i # for i,num in enumerate(array): # if i <= len(array) // 2: # j = hash.get(tsum-num) # if j is not None and i != j: # return [array[i],array[j]] # # 没找到两个元素和为目标值; # return [] """ 思路4:双指针:递增数组有a[0]*a[n]<=a[1]*a[n-1],同样不用比较乘积大小 a[i]+a[j]>tsum,j-- a[i]+a[j]<tsum,i++ """ class Solution: def FindNumbersWithSum(self, array, tsum): if len(array) == 0: return [] i,j = 0,len(array)-1 while(i<j): if array[i] + array[j] == tsum: return[array[i],array[j]] elif array[i] + array[j] > tsum: j -= 1 else: i += 1 # 没找到两个元素和为目标值; return []
class Solution: def FindNumbersWithSum(self, array, tsum): # write code here if not array: return [] for a in array: b = tsum-a if b in array: if a<b: return [a,b] else: return [b,a] else: continue return []
思路:夹逼准则
一头一尾两个指针,相加>目标:右指针前进一位
相加<目标:左指针前进一位
相等则输出
找不到则不存在
class Solution: def FindNumbersWithSum(self, array, tsum): # write code here if not array: return [] n = len(array) i = 0 j = n -1 while i < j: if array[i] + array[j]< tsum: i += 1 elif array[i] + array[j]> tsum: j -= 1 elif array[i] + array[j] == tsum: return array[i],array[j] return []
class Solution: def FindNumbersWithSum(self, array, tsum): # write code here if len(array)<=1: return [] res=[] ans=[] for i in range(len(array)): for j in range(i+1,len(array)): if array[i]+array[j]==tsum: res.append(array[i]*array[j]) ans.append([array[i],array[j]]) if len(res)==0: return [] else: b=res.index(min(res)) return ans[b]
# -*- coding:utf-8 -*- class Solution: def FindNumbersWithSum(self, p, n): # write code here def dfs(p,index,total,n,res): if len(res) == total: if sum(res) == n: arr.append([i for i in res]) return for i in range(index,len(p)): res.append(p[i]) dfs(p,i+1,total,n,res) res.pop() arr = [] dfs(p,0,2,n,[]) if arr == []: return [] MIN = arr[0][0] * arr[0][1] minIndex = 0 for i in range(len(arr)): if MIN > arr[i][0] * arr[i][1]: minIndex = i MIN = arr[i][0] * arr[i][1] return arr[minIndex]
# -*- coding:utf-8 -*- class Solution: def FindNumbersWithSum(self, array, tsum): # write code here s = [] for i in array: s.append(tsum - i) for j in s: if j in array: return (tsum-j,j) return []
class Solution: def FindNumbersWithSum(self, array, tsum): # write code here new_array = array for i in array: if i > tsum: new_array = array[:i] result = [] j = len(new_array) - 1 for i in range(len(new_array)): while j > i: if new_array[i]+new_array[j] == tsum: result.append(([new_array[i],new_array[j],j])) j-=1 # j不用回到最右 从当前点左移一格开始继续就行 break else: j-=1 if i == j: if result: #如果已经找到一个点了,在i增大的情况下,j肯定要比已找到的j更小 j = result[-1][2] - 1 else: #没找到点的话j从最右 j = len(new_array) - 1 if len(result) == 0: return [] else: return result[0][:2]
# -*- coding:utf-8 -*- class Solution: def FindNumbersWithSum(self, array, tsum): # write code here #如果有多对数字和等于S,两个数的差越大,乘积越小 n = len(array) low = 0 high = n-1 while low < high: if array[low] + array[high] == tsum: return array[low],array[high] elif array[low] + array[high] > tsum: high -= 1 else: low += 1 return []
# -*- coding:utf-8 -*- class Solution: def FindNumbersWithSum(self, array, tsum): # write code here l = [] p = [] d = {} for i in range(0, len(array)): for j in range(i+1, len(array)): if array[i] + array[j] == tsum: l.append([array[i], array[j]]) p.append(array[i]*array[j]) else: continue if len(p) != 0: for i in range(0, len(p)): d[p[i]] = l[i] p.sort() return d[p[0]] else: return []
# -*- coding:utf-8 -*- class Solution: def FindNumbersWithSum(self, array, tsum): S=tsum A=array if len(A)<=1: return [] if len(A)==2: if A[0]+A[1]==S: return A re=[] for i in range(len(A)-1): for j in range(i+1,len(A)): if A[i]+A[j]==S: re=[A[i],A[j]] return re return re # write code here
class Solution: def FindNumbersWithSum(self, array, tsum): # write code here dicts = {} res1 = [] res2 = [] for i in range(len(array)): num = tsum - array[i] if num not in dicts: dicts[array[i]] = num else: res1.append([num,dicts[num]]) res2.append(dicts[num]*num) if res1==[]: return [] else: mins = min(res2) return res1[res2.index(mins)]