切換
舊版
前往
大廳
主題

LeetCode - 414. Third Maximum Number 解題心得

Not In My Back Yard | 2020-10-19 00:00:08 | 巴幣 4 | 人氣 579

題目連結:


題目意譯:
給定一個非空整數陣列,回傳陣列中第三大的數字。如果不存在,回傳最大的數字。時間複雜度應為 O(n)。



範例測資:
範例 1:
輸入: [3, 2, 1]
輸出: 1
解釋: 第三大數為 1。

範例 2:
輸入: [1, 2]
輸出: 2
解釋: 不存在第三大的數,因此回傳最大的數字,2。

範例 3:
輸入: [2, 2, 3, 1]
輸出: 1
解釋: 注意,在此的第三大數字指的是第三大的相異數。兩個 2 皆視為第二大的數字。



解題思維:
用三個變數 first 、 second 、 third,分別存最大值、第二大值以及第三大值。

可以將三個變數的初始值設定為很小的值,例如-2 ^ 40 等等(不能使用 -2 ^ 31,因為陣列中有可能出現,會無法辨識);也可以使用布林變數來看看有沒有第二大、第三大等等。

然後我們掃過陣列中的每個數字。每遇到一個數字 n ,先判斷 n 是否等於 first 、 second 、 third ,如果是那就不用更新變數的值。反之,如下:

先判斷 first 是否小於 n 。如果是,表示有新的第一大數,則將 second 的值複製到 third (原本的第二大變為第三大)、first 的值複製到 second (原本的第一大變為第二大),最後將 n 的值複製到 first。

如果上述判斷為非(n 不是新的第一大數),則再判斷 second 是否小於 n。如果是,則將 second 的值複製到 third (因為第二大變為第三大),然後將 n 複製到 second。

最後,如果前面的判斷都為非(n 不是新的第一大、也不是新的第二大),則再判斷 third 有無小於 n 。如果有,就將 third 的值更新成 n。



掃完所有數字後,看看 third ,也就是第三大數,是否存在(藉由一開始的初始值,或是布林變數表示)。如果存在就回傳 third 之值;反之,回傳 first 之值。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作