腦筋急轉彎 找出消失的數字 與 重複的數字 Set Mismatch_Leetcode #645

閱讀時間約 4 分鐘

題目敘述

題目會給定一個整數陣列nums,原本裡面包含有整數1到n,但是中間不小心出了差錯,導致有一個數字消失了,而另一個數字重複了

找出重複的數字以及消失的數字,並且

以陣列的形式[重複的數字, 消失的數字]返回這兩個數字。

例如:

[1,3,3,4]

消失的數字是2,重複的數字是3

答案返回[3, 2]


題目的原文敘述


測試範例

Example 1:

Input: nums = [1,2,2,4]
Output: [2,3]

Example 2:

Input: nums = [1,1]
Output: [1,2]

約束條件

Constraints:

  • 2 <= nums.length <= 10^4

輸入陣列的長度介於2~10^4 之間。題目保證陣列長度至少為2。

  • 1 <= nums[i] <= 10^4

每個陣列元素值介於1 ~ 10^4 之間。


演算法

除了第一直覺的字典統計出現次數的演算法之外。

還有一個偏向數學推理的演算法。


題目說 有一個數字消失有一個數字重複

所以,

理想中(沒有出錯)的總和 perfect sum = 1 + 2 + ... + n

= 數列和公式 = 1 * (n+1) / 2


第一步:

perfect sum - 輸入陣列中曾經出現過的數字(相當與建立集合set的動作)總和

= 消失的數字

到這一步,就已經找到消失的數字


第二步:

接下來,

理想中(沒有出錯)的總和 perfect sum + 重複的數字

= 1 + 2 + ... + n + 重複的數字

= { 1 * (n+1) / 2 } + 重複的數字

= (有出錯的)輸入陣列的總和 + 消失的數字

剛剛第一步已經知道消失的數字,而pefect sum透過數列和公式可以直接求出,輸入陣列的總和也只要直接相加就可以知道。

現在未知項是重複的數字,這邊只要做個簡單的加減法計算就可以得到重複的數字


最後,以陣列的形式[重複的數字, 消失的數字]返回答案即可。


程式碼

class Solution:
def findErrorNums(self, nums: List[int]) -> List[int]:

# get the size of input array, nums

n = len(nums)

# perfect_sum
# = n * ( n+1 ) // 2
# = sum of unique element + missing element

perfect_sum = n * (n+1) // 2

# compute the missing element from summation formula

missing_element = perfect_sum - sum( set(nums) )

# perfect sum + repeated element = sum of nums + missing element
# compute the repeated element

repeated_element = sum(nums) + missing_element - perfect_sum

return [ repeated_element, missing_element]



複雜度分析

時間複雜度:

從頭到尾掃描過每個元素,建立集合 和 計算數列和,所需時間為O(n)。

空間複雜度:

建立集合set(nums),所需空間為O(n)


關鍵知識點

從數字應該出現一次的標準答案 1 + 2 + 3 + ... + n

聯想到可以用數列和的公式求出,並且推理出消失的數字重複的數字是誰。


Reference:

[1] Set Mismatch - LeetCode

52會員
339內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
從電影《腦筋急轉彎》看情緒如何影響科技與未來|實戰篇|前導|【怪獸】你與科技的距離 EP5.2不知道你有沒有想過這個問題:我們是否應該全然避免情緒的干擾,透過理性和量化的方式來做決策?皮克斯動畫《腦筋急轉彎》(Inside Out,2015)給我們一個獨特的視角來反思這個問題。
Thumbnail
avatar
王政皓|怪獸科技公司
2023-08-11
允許悲傷——腦筋急轉彎在搬家後的萊莉來到的陌生的新環境,而這一切都是如此令人不「樂樂」…..
avatar
舒雅
2023-07-18
【皮克斯|腦筋急轉彎 Inside out】用最高明的故事餵你喝最純的雞湯即便到了2023年的今日,這部作品是我認為皮克斯最打動我的一部 當時的我是個即將畢業的大學生,還記得我是在跟幾個好友從外縣市過夜旅遊回來後,臨時起意就帶著行李直接到電影院觀看這部片,結果我根本是滿臉淚水跟鼻涕地走出電影院,久久難以釋懷這部動畫帶給我的衝擊,同行的兩位友人還表示「是有好看到能讓你這樣嗎
Thumbnail
avatar
奶油貓
2023-05-28
電影《腦筋急轉彎》│沒有不好的情緒,只有你不懂的情緒;讓情緒帶領,建構更好的自己我們無可避免的希望,生活裡永遠有喜悅相伴,但現實是,生活裡不時有事件,讓我們心緒起伏,當悲傷、厭惡、恐懼等情緒讓我們不舒服時,也要試著去體會、思考,他們要告訴我們什麼?讓情緒成為路引,帶領我們更認識自己,並協助我們,成為愈來愈好的人,這是我一直在學習的,也是我想要帶著我的寶貝們一起要認識的人生功課。
Thumbnail
avatar
亭安 Ann Lin
2022-11-22
【腦筋急轉彎】觀影心得—誰在當家作主?這個看似簡單的成長電影,其實用了異常豐富的敘事線去描摹人類複雜的大腦運作模式,主創者把人類的五種基本情緒:喜、怒、哀、驚、厭一一擬人化,並且依照現今心理學的理論去把大腦內的運作模式呈現出來,達到了寓教於樂的效果。
Thumbnail
avatar
Rady
2022-11-04
《腦筋急轉彎 》中樞神經元消失了,給半熟青春的生心理學課心情讓神經也「壞」 生理方面 短期記憶變成長期記憶與記憶固化有關。這過程會有細胞和分子間的變化,進而造成神經們改變,通常是在時間下所造成的。而改變原因是為了保護腦中的記憶受刺激或病變的擾亂。 心理方面 腦洞大開的旅途 資料來源
Thumbnail
avatar
Ariel
2022-05-19
【腦筋急轉彎】2015【腦筋急轉彎】抽絲撥繭就是部成長電影,導演彼德達克特試圖探索小孩在踏入青春期前的內在變化,實則說了個對自我探索的寓言故事。
Thumbnail
avatar
楚天闊/影音亞空間
2022-04-20
《腦筋急轉彎》信念與連結:多年後才領受的關鍵戲 近日在 podcase 中聽到《腦筋急轉彎》(Inside Out, 2015)的編劇之一,梅格.勒福夫(Meg LeFauve)談起當年的劇本工作,邊聽創作背後的人說著故事,邊想起這部片中相關的片段,是劇迷一個很好玩很幸福的時刻,感謝著這部片子能夠這樣呈現,能夠看過這部動畫電影真的好棒。
Thumbnail
avatar
挑高健身房
2021-09-03
《腦筋急轉彎》—為有適當的選擇情緒,它才能夠使你看見的世界是多彩的顏色人的情緒不只是表達想法的管道,也是認識自己的方式。沒有一種情緒應該被壓抑甚至切割,所有的情緒都是人真實的一部分,而這樣的每一個部分,不該用管理的方式處理,而應是思考如何選擇當下適當的情緒,讓情緒能成為自己的力量,彰顯自己內心的想法。
Thumbnail
avatar
日宣
2019-07-20
《腦筋急轉彎》Inside out 朝向終極快樂的祕密  顯然,《腦筋急轉彎》的故事,正在呈現的是「一個孩子的內在成長」:她正要面對的是,度過人生起伏的歷程,以經驗交織記憶,慢慢調和出自我的內在,訓練自己的情緒管理,還有找到自我呈現的方式。
Thumbnail
avatar
希米露
2018-06-08