尋找和為定值的兩個或多個數

2021-06-26 22:52:08 字數 2740 閱讀 1620

一、尋找和為定值的兩個數

題目:輸入乙個陣列和乙個數字,在陣列中查詢兩個數,使得它們的和正好是輸入的那個數字。

要求時間複雜度是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 可以換乙個思...