一、尋找和為定值的兩個數
題目:輸入乙個陣列和乙個數字,在陣列中查詢兩個數,使得它們的和正好是輸入的那個數字。
要求時間複雜度是o(n)。如果有多對數字的和等於輸入的數字,輸出任意一對即可。
例如輸入陣列1、2、4、7、11、15和數字15。由於4+11=15,因此輸出4和11。
詳情參考
用乙個hash表,儲存每乙個數的下標。時間複雜度o(n),空間複雜度為o(n).
#!/usr/bin/env python
# -*- coding: utf-8 -*
#查詢陣列中兩個數為指定值的兩個數
def twosum(a, s):
'''找到陣列中和為定值的兩個數,返回其對應的下標'''
l = len(a)
mhash,res = {},
for i in xrange(l):
mhash[a[i]] = i
for i in xrange(l):
t = s - a[i]
if mhash.has_key(t):
break
return res
if __name__ == '__main__':
a = [1, 2, 4, 7, 11, 15]
s = 15
print 'the index are :' ,twosum(a,s)
方法二:先排序,然後左右夾逼。排序o(n*logn),夾逼o(n),總的時間複雜度為o(n*logn),空間複雜度為o(1)。 也可以採用二分查詢,但是總的時間複雜度不變。
#!/usr/bin/env python
# -*- coding: utf-8 -*
#查詢陣列中兩個數為指定值的兩個數
def partition(s, m, n):
#s is a list
key = s[n-1]
l,r = m,n-2
while true:
while l <= n-2 and s[l] <= key:
l += 1
while r>= m and s[r] > key:
r -= 1
if l < r:
s[l],s[r] = s[r],s[l]
else:
break
s[l],s[n-1] = s[n-1],s[l]
return l
def medin3(s, m, n):
md = m + (n-m)/2
if s[m] > s[md]:
s[m],s[md] = s[md],s[m]
if s[m] > s[n]:
s[m],s[n] = s[n],s[m]
if s[md] > s[n]:
s[md],s[n] = s[n],s[md]
s[md],s[n-1] = s[n-1],s[md]
return s[n-1]
def quicksort(s, m, n):
#s is a list
if m < n:
medin3(s, m, n)
k = partition(s, m, n)
quicksort(s, m, k)
quicksort(s, k+1, n)
def twosumd(a, s):
'''快速排序,夾逼, 返回兩個數'''
lens = len(a)
quicksort(a, 0, lens-1)
l,r = 0,lens-1
while ls:
r -= 1
else:
return (a[l],a[r])
return false
if __name__ == '__main__':
a = [1, 2, 4, 7, 11, 15]
s = 15
print 'the index are :' ,twosumd(a,s)
二、尋找和為定值的多個數
題目:輸入兩個整數 n 和 m,從數列1,2,3.......n 中 隨意取幾個數,
使其和等於 m ,要求將其中所有的可能組合列出來
#!/usr/bin/env python
# -*- coding: utf-8 -*
#查詢陣列中和為指定值的多個數
mlist =
def find_factor(s, n):
'''找到和為s的1...n中的序列'''
if n <= 0 or s <= 0:
return ;
if s == n:
print n,
for i in mlist:
print ' + ', i,
print '\n'
mlist.insert(0, n)
find_factor(s-n, n-1) #包含有n的序列
del mlist[0]
find_factor(s, n-1) #不包含有n的序列
if __name__ == '__main__':
m = int(raw_input('input the sum :'))
n = int(raw_input('input the n :'))
find_factor(m, n)
005尋找滿足和為定值的兩個或多個數
題目 輸入乙個陣列和乙個數字,在陣列中查詢兩個數,使得它們的和正好是輸入的那個數字。要求時間複雜度是o n 如果有多對數字的和等於輸入的數字,輸出任意一對即可。例如輸入陣列1 2 4 7 11 15和數字15。由於4 11 15,因此輸出4和11。分析 思路一 排序,兩頭向中間遍歷,兩頭和大於sum...
尋找和為定值的兩個數
尋找和為定值的兩個數 給定乙個陣列 無序或者有序,兩種情況都要考慮 找出和為m的兩個數。最多時間複雜度能有多少?陣列有序的情況,在時間複雜度上我們就省去了排序的o nlogn 我們使用兩端指標掃瞄法是比較簡單的,時間複雜度為o n 空間複雜度為o 1 如下圖所示 然後,判斷它們指向的值之和sum是否...
尋找和為定值的兩個數
描述 輸入乙個陣列和乙個數字,在陣列中查詢兩個數,使得它們的和正好是輸入的那個數字。要求時間複雜度是o n 如果有多對數字的和等於輸入的數字,輸出任意一對即可。例如輸入陣列1 2 4 7 11 15和數字15。由於4 11 15,因此輸出4和11。分析 如果採取窮舉,複雜度為o n 2 可以換乙個思...