输入一个递增排序的数组array和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,返回任意一组即可,如果无法找出这样的数字,返回一个空数组即可。
数据范围:
0<=len(array)<=105
1<=array[i]<=106
[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]都是可以的
# -*- 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)]
typedef vector<int> vi; class Solution { public: vi FindNumbersWithSum(const vi& a,int sum) { vi res; int n = a.size(); int i = 0, j = n - 1; while(i < j){ if(a[i] + a[j] == sum){ res.push_back(a[i]); res.push_back(a[j]); break; } while(i < j && a[i] + a[j] > sum) --j; while(i < j && a[i] + a[j] < sum) ++i; } return res; } };