演算法--求陣列第二大的數
阿新 • • 發佈:2018-11-16
給定一個數組,求其第二大的數
昨天一道面試題,一時間竟然沒有反應過來,以前遇見過topK問題,一般採用快速排序partition以及堆排序來解決,時間複雜度為NlogK.
後來仔細想了一下,感覺可以直接優化求解:
利用兩趟氣泡排序,第一趟最大值置於陣列最後一個位置,第二趟第二大置於陣列倒數第二位置 時間複雜度2N
def secondMax(num): for i in range(0,2): for j in range(0, len(num)-i-1): if num[j]>num[j+1]: swap(num, j, j+1) return num[-2]
後來又想了一下,感覺寫的不夠健壯,沒有考慮特殊情況,例如陣列中最大值有重複值 1,2,5,5,4,3
可以考慮冒泡交換時,只有當前元素大於下一個元素並且小於最大值時,才交換當前元素與下一個元素 2N
def secondMax2(num): for j in range(0, len(num)-1): if num[j]>num[j+1]: swap(num, j, j+1) max = num[-1] for j in range(0, len(num)-2): if num[j]>num[j+1] and num[j]<max: swap(num, j, j+1) return num[-2]
當陣列元素長度為1以及陣列中元素全部相同時,此時沒有第二大值
可以用兩個變數來儲存當前最大以及第二大值,使用一次遍歷,每訪問一個元素,則根據訪問元素以及與最大值,第二大值的大小關係來不斷更新其取值,最終返回第二大值即可,時間複雜度為 N
def secondMax3(num): if(len(num)<=1) or len(set(num))==1: return None firstmax = max(num[0], num[1]) secondMax = min(num[0], num[1]) for i in range(2, len(num)): if num[i]>firstmax: secondMax = firstmax firstmax = num[i] elif num[i]<firstmax and num[i]>secondMax: secondMax = num[i] else: continue return secondMax