腦筋急轉彎 找出消失的數字 與 重複的數字 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

85會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
這題也算是Leetcode 上經典的DP考題之一,也是很好的DP邏輯思考練習題。 題目敘述 題目會給我們一個nums陣列,分別代表每棟房屋的價值,也就是房屋內有的現金數量。 題目敘述給的情境是假想盜賊要偷東西,限制是相鄰的兩棟房屋不能一起偷,只能選擇其中一棟,否則就會觸發警報器。 請問怎麼選
題目敘述 題目會給我們一個二維陣列matrix,分別代表每個格子的成本,請問我們從最頂端到底部的下墜路徑的最小成本總和是多少? 每次下墜到下一排的時候,可以有三種選擇: 1.往左下角移動。 2.往正下方移動。 3.往右下角移動。 題目的原文敘述 測試範例 Example 1:
題目敘述 題目會給定一個整數陣列arr,要求我們判斷是否每個元素的出現次數都不同? 題目的原文敘述 測試範例 Example 1: Input: arr = [1,2,2,1,1,3] Output: true Explanation: The value 1 has 3 occurre
題目敘述 題目會給我們一組定義好的界面和需求,要求我們設計一個資料結構,可以滿足平均O(1)的插入元素、刪除元素、隨機取得元素的操作。 RandomizedSet() 類別建構子 bool insert(int val) 插入元素的function界面 bool remove(int val
題目敘述 題目會給定我們一個比賽紀錄陣列matches,裡面以pair的方式儲存,每個pair的第一個欄位代表這場比賽的贏家ID,第二個欄位代表這場比賽的輸家ID。 題目要求我們找出所有沒有輸的玩家ID,和只輸一場的玩家ID。 計算時,只考慮有比賽紀錄的玩家。 輸出時,依照遊戲玩家的ID,從
題目敘述 題目會給定我們兩個字串word1 和 word2。 允許我們不限制次數進行下列兩種操作: 任意調換其中兩個字元的位置。 把字串中的某個字元全部置換成另一個字元,同時把另一個字元同時置換成某個字元。(例如把字串中原本的a都換成b,把原本的b都換成a) 問我們能不能通過上述兩項操作,
這題也算是Leetcode 上經典的DP考題之一,也是很好的DP邏輯思考練習題。 題目敘述 題目會給我們一個nums陣列,分別代表每棟房屋的價值,也就是房屋內有的現金數量。 題目敘述給的情境是假想盜賊要偷東西,限制是相鄰的兩棟房屋不能一起偷,只能選擇其中一棟,否則就會觸發警報器。 請問怎麼選
題目敘述 題目會給我們一個二維陣列matrix,分別代表每個格子的成本,請問我們從最頂端到底部的下墜路徑的最小成本總和是多少? 每次下墜到下一排的時候,可以有三種選擇: 1.往左下角移動。 2.往正下方移動。 3.往右下角移動。 題目的原文敘述 測試範例 Example 1:
題目敘述 題目會給定一個整數陣列arr,要求我們判斷是否每個元素的出現次數都不同? 題目的原文敘述 測試範例 Example 1: Input: arr = [1,2,2,1,1,3] Output: true Explanation: The value 1 has 3 occurre
題目敘述 題目會給我們一組定義好的界面和需求,要求我們設計一個資料結構,可以滿足平均O(1)的插入元素、刪除元素、隨機取得元素的操作。 RandomizedSet() 類別建構子 bool insert(int val) 插入元素的function界面 bool remove(int val
題目敘述 題目會給定我們一個比賽紀錄陣列matches,裡面以pair的方式儲存,每個pair的第一個欄位代表這場比賽的贏家ID,第二個欄位代表這場比賽的輸家ID。 題目要求我們找出所有沒有輸的玩家ID,和只輸一場的玩家ID。 計算時,只考慮有比賽紀錄的玩家。 輸出時,依照遊戲玩家的ID,從
題目敘述 題目會給定我們兩個字串word1 和 word2。 允許我們不限制次數進行下列兩種操作: 任意調換其中兩個字元的位置。 把字串中的某個字元全部置換成另一個字元,同時把另一個字元同時置換成某個字元。(例如把字串中原本的a都換成b,把原本的b都換成a) 問我們能不能通過上述兩項操作,
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
不知道你有沒有想過這個問題:我們是否應該全然避免情緒的干擾,透過理性和量化的方式來做決策?皮克斯動畫《腦筋急轉彎》(Inside Out,2015)給我們一個獨特的視角來反思這個問題。
在搬家後的萊莉來到的陌生的新環境,而這一切都是如此令人不「樂樂」…..
Thumbnail
即便到了2023年的今日,這部作品是我認為皮克斯最打動我的一部 當時的我是個即將畢業的大學生,還記得我是在跟幾個好友從外縣市過夜旅遊回來後,臨時起意就帶著行李直接到電影院觀看這部片,結果我根本是滿臉淚水跟鼻涕地走出電影院,久久難以釋懷這部動畫帶給我的衝擊,同行的兩位友人還表示「是有好看到能讓你這樣嗎
Thumbnail
我們無可避免的希望,生活裡永遠有喜悅相伴,但現實是,生活裡不時有事件,讓我們心緒起伏,當悲傷、厭惡、恐懼等情緒讓我們不舒服時,也要試著去體會、思考,他們要告訴我們什麼?讓情緒成為路引,帶領我們更認識自己,並協助我們,成為愈來愈好的人,這是我一直在學習的,也是我想要帶著我的寶貝們一起要認識的人生功課。
Thumbnail
這個看似簡單的成長電影,其實用了異常豐富的敘事線去描摹人類複雜的大腦運作模式,主創者把人類的五種基本情緒:喜、怒、哀、驚、厭一一擬人化,並且依照現今心理學的理論去把大腦內的運作模式呈現出來,達到了寓教於樂的效果。
Thumbnail
心情讓神經也「壞」 生理方面 短期記憶變成長期記憶與記憶固化有關。這過程會有細胞和分子間的變化,進而造成神經們改變,通常是在時間下所造成的。而改變原因是為了保護腦中的記憶受刺激或病變的擾亂。 心理方面 腦洞大開的旅途 資料來源
Thumbnail
【腦筋急轉彎】抽絲撥繭就是部成長電影,導演彼德達克特試圖探索小孩在踏入青春期前的內在變化,實則說了個對自我探索的寓言故事。
Thumbnail
近日在 podcase 中聽到《腦筋急轉彎》(Inside Out, 2015)的編劇之一,梅格.勒福夫(Meg LeFauve)談起當年的劇本工作,邊聽創作背後的人說著故事,邊想起這部片中相關的片段,是劇迷一個很好玩很幸福的時刻,感謝著這部片子能夠這樣呈現,能夠看過這部動畫電影真的好棒。
Thumbnail
人的情緒不只是表達想法的管道,也是認識自己的方式。沒有一種情緒應該被壓抑甚至切割,所有的情緒都是人真實的一部分,而這樣的每一個部分,不該用管理的方式處理,而應是思考如何選擇當下適當的情緒,讓情緒能成為自己的力量,彰顯自己內心的想法。
Thumbnail
  顯然,《腦筋急轉彎》的故事,正在呈現的是「一個孩子的內在成長」:她正要面對的是,度過人生起伏的歷程,以經驗交織記憶,慢慢調和出自我的內在,訓練自己的情緒管理,還有找到自我呈現的方式。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
不知道你有沒有想過這個問題:我們是否應該全然避免情緒的干擾,透過理性和量化的方式來做決策?皮克斯動畫《腦筋急轉彎》(Inside Out,2015)給我們一個獨特的視角來反思這個問題。
在搬家後的萊莉來到的陌生的新環境,而這一切都是如此令人不「樂樂」…..
Thumbnail
即便到了2023年的今日,這部作品是我認為皮克斯最打動我的一部 當時的我是個即將畢業的大學生,還記得我是在跟幾個好友從外縣市過夜旅遊回來後,臨時起意就帶著行李直接到電影院觀看這部片,結果我根本是滿臉淚水跟鼻涕地走出電影院,久久難以釋懷這部動畫帶給我的衝擊,同行的兩位友人還表示「是有好看到能讓你這樣嗎
Thumbnail
我們無可避免的希望,生活裡永遠有喜悅相伴,但現實是,生活裡不時有事件,讓我們心緒起伏,當悲傷、厭惡、恐懼等情緒讓我們不舒服時,也要試著去體會、思考,他們要告訴我們什麼?讓情緒成為路引,帶領我們更認識自己,並協助我們,成為愈來愈好的人,這是我一直在學習的,也是我想要帶著我的寶貝們一起要認識的人生功課。
Thumbnail
這個看似簡單的成長電影,其實用了異常豐富的敘事線去描摹人類複雜的大腦運作模式,主創者把人類的五種基本情緒:喜、怒、哀、驚、厭一一擬人化,並且依照現今心理學的理論去把大腦內的運作模式呈現出來,達到了寓教於樂的效果。
Thumbnail
心情讓神經也「壞」 生理方面 短期記憶變成長期記憶與記憶固化有關。這過程會有細胞和分子間的變化,進而造成神經們改變,通常是在時間下所造成的。而改變原因是為了保護腦中的記憶受刺激或病變的擾亂。 心理方面 腦洞大開的旅途 資料來源
Thumbnail
【腦筋急轉彎】抽絲撥繭就是部成長電影,導演彼德達克特試圖探索小孩在踏入青春期前的內在變化,實則說了個對自我探索的寓言故事。
Thumbnail
近日在 podcase 中聽到《腦筋急轉彎》(Inside Out, 2015)的編劇之一,梅格.勒福夫(Meg LeFauve)談起當年的劇本工作,邊聽創作背後的人說著故事,邊想起這部片中相關的片段,是劇迷一個很好玩很幸福的時刻,感謝著這部片子能夠這樣呈現,能夠看過這部動畫電影真的好棒。
Thumbnail
人的情緒不只是表達想法的管道,也是認識自己的方式。沒有一種情緒應該被壓抑甚至切割,所有的情緒都是人真實的一部分,而這樣的每一個部分,不該用管理的方式處理,而應是思考如何選擇當下適當的情緒,讓情緒能成為自己的力量,彰顯自己內心的想法。
Thumbnail
  顯然,《腦筋急轉彎》的故事,正在呈現的是「一個孩子的內在成長」:她正要面對的是,度過人生起伏的歷程,以經驗交織記憶,慢慢調和出自我的內在,訓練自己的情緒管理,還有找到自我呈現的方式。