LeetCode每日一題題解(0328)

<code>給定一副牌,每張牌上都寫著一個整數。

此時,你需要選定一個數字 X,使我們可以將整副牌按下述規則分成 1 組或更多組:


每組都有 X 張牌。
組內所有的牌上都寫著相同的整數。
僅當你可選的 X >= 2 時返回 true。



示例 1:

輸入:[1,2,3,4,4,3,2,1]
輸出:true
解釋:可行的分組是 [1,1],[2,2],[3,3],[4,4]
示例 2:

輸入:[1,1,1,2,2,2,3,3]
輸出:false
解釋:沒有滿足要求的分組。
示例 3:

輸入:[1]
輸出:false
解釋:沒有滿足要求的分組。
示例 4:

輸入:[1,1]
輸出:true
解釋:可行的分組是 [1,1]
示例 5:

輸入:[1,1,2,2,2,2]
輸出:true
解釋:可行的分組是 [1,1],[2,2],[2,2]

提示:

1 <= deck.length <= 10000
0 <= deck[i] < 10000


/<code>

這個題目我們簡單翻譯翻譯,就是給你若干個數,然後求是否存在一個數,每個數都能整除它。求兩個數的最大公約數,通常我們可以使用輾轉相除法。求三個數的最大公約數,我們可以使用前兩個數的最大公約數再跟第三個數進行輾轉相除法求最大公約數。同理,N個數我們也可以求他們的最大公約數。


LeetCode每日一題題解(0328)


輾轉相除法,又稱歐幾里得算法,他的算法複雜度我們可以近似地看成O(lgN)。但是我們仔細看下題目的數據範圍,才1萬張牌,說明最後不同的數也就大概sqrt(2萬)不到150個。所以,既然數據範圍這麼少,我們為什麼要殺雞用牛刀呢?這裡講一個面試中的套路,在面試中遇到算法題,問清楚數據範圍,假如面試官沒有說用最優的方法,我就用最簡單的算法來做,保證代碼萬無一失。不出意外的話,面試官會問你有沒有更優的解法,這個時候在balabala地說出來,假如面試官沒有問,也可以主動提起,說我們的解法是基於數據規模的,我還有更優的解法,這些解法各自的優缺點是什麼,適用於怎麼樣的數據場景。從而展示自己的問題考慮周全的一面。好了今天的題目就到這裡,我們最後看下這種暴力寫法吧。


LeetCode每日一題題解(0328)


分享到:


相關文章: