首先,從題目可以看出,對于大部分的開發者來說,這是一個基礎得不能再基礎的題目了,是以,知道如何求解以及對求解過程完全掌握的話,可以不用往下看了,如果對于這個問題希望能複習一下,或者不太了解的話,可以接着往下看。我寫的實在也有浪費閱讀者時間的嫌疑,而目的也隻是希望用清晰明确的語言将這些簡單的題目講解清楚,來提升表達方面的能力。
題目描述
給定一個無序的數組,求出這個數組中的最大值與最小值。
解題思路
比方說,有一個無序的數組[3,5,7,2],可以看出,這個數組中最大值是2,最小值是7。
如何求呢? 先求最大值,我們可以先聲明一個變量為最大值,這個變量初始值為數組中的第一個元素,然後循環周遊這個數組,将目前這個最大值與目前周遊的元素進行比較,如果目前的元素比這個變量大,則更新這個最大值為目前元素的值。
代碼實作
使用swift代碼,注意此時代碼中元素的類型應該使用泛型,傳回類型應該為optional(可選型),因為數組如果為空的話,并不存在最大值與最小值。如下代碼為求數組中的最大值。
func findMax<T:Comparable>(_ array: [T]) ->T? {
guard var max = array.first else { return nil }
for element in array.dropFirst() {
if(element > max){
max = element
}
}
return max
}
複制代碼
以[3,5,7,2]這個數組為例,進行具體的講解,首先,假設數組中的第一位3為最大值,先與後面的5開始比較,5比較大,此時更新5為最大值,再與後面的7比較,7又比5大,更新7位最大值,7在與2進行比較,7比2大,保持不變,循環結束,7為數組中的最大值。
求最小值同樣思路:
func findMin<T:Comparable>(_ array: [T]) ->T? {
guard var min = array.first else { return nil }
for element in array.dropFirst() {
if(element < min){
min = element
}
}
return min;
}
複制代碼
另外,在語言的标準庫中,也可能封裝好了求解最大值,最小值的函數,可以直接使用。
let array = [4,12,56,32,65,2,3,6]
array.min() // 求最小值 傳回2
array.max() // 求最大值 傳回65
複制代碼
如何把求最大值與最小值封裝到一個函數裡呢?在swift中,可以使用元組同時傳回最大值與最小值。
示例代碼:
func findMaxMin<T:Comparable>(_ array:[T]) ->(min: T,max:T)? {
guard var min = array.first else { return nil }
var max = min
let start = array.count % 2 // 如果個數為單數,則從index = 1開始周遊
for i in stride(from: start, to: array.count, by: 2) {
let pair = (array[i],array[i+1])
if(pair.0 > pair.1){
if pair.0 > max {
max = pair.0
}
if pair.1 < min {
min = pair.1
}
} else {
if pair.1 > max {
max = pair.1
}
if pair.0 < min {
min = pair.0
}
}
}
return (min, max)
}
複制代碼
代碼的整體邏輯并不難了解,以數組[3,7,2,5,9] 為例進行講解。
首先取首元素作為最大值與最小值,然後判斷數組元素的個數是單數還是雙數,如果是單數,則周遊數組從index = 1開始,這是因為數組進行周遊時,是成對進行周遊。
數組[3,7,2,5,9]元素個數是單數,第一次取7,2組成元組(7,2),然後7 與2 進行比較,7比2大,是以7與設定為最大值的首元素進行比較,7比3大,7取代3成為最大值。然後2與同樣設定為最小值的3進行比較,2比3小,2取代3成為最小值。
繼續下一組5,9組成元組,先組内進行比較,9比5大,是以用9與暫時的最大值7進行比較,9比7大,9取代7成為最大值。然後用5與暫時的最小值2進行比較,2比5小,2依舊保持為目前的最小值。
循環結束,目前的最小值2,最大值9,組成元組(2, 9),作為函數的傳回值進行輸出。自此,函數運作結束。
在有些語言中或許沒有類似元組的資料結構,也可以使用數組,數組的第一個元素存儲最小值,第二個元素存儲最大值。也可以使用map,進行鍵值存儲後作為函數傳回值輸出。
時間複雜度分析
循環周遊了數組一遍,并取出元素的每個元素進行了最大或最小的比較,是以這個算法的時間複雜度是O(n)。
轉載于:https://juejin.im/post/5d3a76f05188257f3850e067