问题很简单直接看实现即可
#!usr/bin/env python
#encoding:utf-8
'''
__Author__:沂水寒城
功能:在给定递减数组中寻找两个数和等于定值,乘积最小
'''
def test_func(num_list, num):
'''
'''
tmp=num_list[0]*num_list[1]
length=len(num_list)
res_list=[]
for i in range(length):
for j in range(length-1,-1,-1):
if num_list[i]+num_list[j]==num:
one=num_list[i]*num_list[j]
res_list.append([num_list[i], num_list[j]])
tmp=min(tmp,one)
print 'All num pairs are:', res_list
print 'min mutilple result is:', tmp
if __name__ == '__main__':
num_list=[35,28,25,20,19,18,17,16,15,14,13,12,10,9,8,7,6,5,4,3,2,1]
num=20
test_func(num_list,num)
结果如下:
All num pairs are: [[19, 1], [18, 2], [17, 3], [16, 4], [15, 5], [14, 6], [13, 7], [12, 8], [10, 10], [8, 12], [7, 13], [6, 14], [5, 15], [4, 16], [3, 17], [2, 18], [1, 19]]
min mutilple result is: 19
[Finished in 0.3s]
当然上面的方法是最直观最简单的但是简单的想法带来的是时间复杂度的提升,在这里考虑可以将时间复杂度降低为O(n)级别,即只需要一次遍历元素即可,这个题目是我今天下午面试的编程中的一个,这个思路我想到了但是因为紧张当时面试官问我还有没有复杂都不是O(n*n)的方法,我说没想到,主要是紧张导致我以为这种简单的方法时间复杂度也是O(n*n)了,哎,真是不应该,简单的方法采用的策略是:首尾同时开始遍历,很简单,下面是具体实现:
#!usr/bin/env python
#encoding:utf-8
'''
__Author__:沂水寒城
功能:在给定递减数组中寻找两个数和等于定值,乘积最小
'''
def test_func(num_list, num):
'''
暴力法
'''
tmp=num_list[0]*num_list[1]
length=len(num_list)
res_list=[]
for i in range(length):
for j in range(length-1,-1,-1):
if num_list[i]+num_list[j]==num:
one=num_list[i]*num_list[j]
res_list.append([num_list[i], num_list[j]])
tmp=min(tmp,one)
print 'All num pairs are:', res_list
print 'min mutilple result is:', tmp
def test_func2(num_list, num):
'''
简单法
'''
temp=num_list[0]*num_list[1]
res_list=[]
start=0
end=len(num_list)-1
while start!=end:
tmp=num_list[start]+num_list[end]
if tmp==num:
temp=min(temp, num_list[start]*num_list[end])
res_list.append([num_list[start], num_list[end]])
if tmp<num:
end-=1;
else:
start+=1
print 'All num pairs are:', res_list
print 'min mutilple result is:', tmp
if __name__ == '__main__':
num_list=[35,28,25,20,19,18,17,16,15,14,13,12,10,9,8,7,6,5,4,3,2,1]
num=20
test_func(num_list,num)
print '---------------------------------------------------------'
test_func2(num_list, num)
结果如下:
All num pairs are: [[19, 1], [18, 2], [17, 3], [16, 4], [15, 5], [14, 6], [13, 7], [12, 8], [10, 10], [8, 12], [7, 13], [6, 14], [5, 15], [4, 16], [3, 17], [2, 18], [1, 19]]
min mutilple result is: 19
---------------------------------------------------------
All num pairs are: [[19, 1], [18, 2], [17, 3], [16, 4], [15, 5], [14, 6], [13, 7], [12, 8]]
min mutilple result is: 19
[Finished in 0.4s]
可以看到:
虚线上面的是暴力法,结果列表长度是简单方法的两倍正好所有的数对均出现两次,结果均正确