昨天參加leetcode的周賽的時候,寫**的過程中遇到了需要獲取遍歷過程**現的最小值和次小值的場景。
由於之前沒有認真思考過這個邏輯,導致當時浪費了不少時間。
現在把這個邏輯好好梳理一下。
下面以最小值和次小值為例。
首先需要宣告兩個變數
first_min, second_min = float('inf'), float('inf')
如果當前元素n小於first_min
, 說明n是目前已知的最小值,但是不能直接更新最小值,因為還需要維持次小值,因此,需要先把當前最小值賦值給次小值,然後再把當前元素賦值給最小值。
如果當前元素n不小於first_min
,但是小於second_min
,那麼就只需要更新次小值。
"""
在遍歷陣列的過程中
儲存最大值, 次大值, 最小值, 次小值
"""from typing import list
deffind_min_and_second_min
(nums: list[
int]):
first_max, second_max =
float
('-inf'),
float
('-inf'
) first_min, second_min =
float
('inf'),
float
('inf'
)for n in nums:
# 如果當前元素大於現有最大值
# 先更新次大值
# 然後更新最大值
if first_max < n:
second_max = first_max
first_max = n
# 如果當前元素不大於現有最大值, 但是大於現有次大值
# 則只更新次大值
elif second_max < n:
second_max = n
# 如果當前元素小於現有最小值
# 先更新次小值
# 然後更新最小值
if first_min > n:
second_min = first_min
first_min = n
# 如果當前元素不小於現有最小值, 但是小於現有次小值
# 則只更新次小值
elif second_min > n:
second_min = n
print
(first_max, second_max, first_min, second_min)
if __name__ ==
'__main__'
: s =[63
,2,6
,11,1
,0,2
,0]
find_min_and_second_min(s)
找出陣列中的最大值和次大值
給定乙個含有n個元素的整型陣列,求其最大值和次大值 思想和上一題類似,同樣是用分治法,先求出左邊的最大值leftmax和次大值leftsecond,再求出右邊的最大值rightmax和次大值rightsecond,然後合併,如何合併呢?分情況考慮 1 如果leftmax rightmax,那麼可以肯...
求出陣列的最大值和次大值
求陣列的最大值相對來說是比較簡單,只需要遍歷一遍陣列,不斷更新陣列的最大值,直到遍歷完成。自然語言描述 1.初始化最大值的角標 2.遍歷陣列,比較當前的最大值角標的元素和遍歷得到陣列元素的大小 如果陣列元素大於當前最大值,更新最大值角標為遍歷到的陣列元素角標,直到遍歷完成程式語言描述 int get...
輸出陣列中的最大值與次大值,以及它們的下標
include int main void if a 0 a 1 else 設定兩個變數用來儲存最大值與次大值下標 for i 2 i 10 i else if a i a index sec 若a i 沒有最大值大,但是比次大值大,則a i 是當前次大值,index sec存當前下標 index ...