給定一副牌,每張牌上都寫著乙個整數。
僅當你可選的x >= 2
時返回true
。
示例 1:
輸入:[1,2,3,4,4,3,2,1]示例 2:輸出:true
解釋:可行的分組是 [1,1],[2,2],[3,3],[4,4]
輸入:[1,1,1,2,2,2,3,3]示例 3:輸出:false
解釋:沒有滿足要求的分組。
輸入:[1]示例 4:輸出:false
解釋:沒有滿足要求的分組。
輸入:[1,1]示例 5:輸出:true
解釋:可行的分組是 [1,1]
輸入:[1,1,2,2,2,2]輸出:true
解釋:可行的分組是 [1,1],[2,2],[2,2]
1 <= deck.length <= 10000
0 <= deck[i] < 10000
bool hasgroupssizex(vector& deck)
1、這道題給定乙個vector,vector中存放著卡牌的數字,比如1、2、3、4這樣子,你需要把這些卡牌分成多組。
要求同一組中的卡牌數字一致,並且每一組中的卡牌張數一樣。
比如123321,你就可以分成[1,1],[2,2],[3,3]。
如果可以這樣分組,並且組中卡牌張數大於等於2,那麼返回true,否則返回false。
限制卡牌數字在[0,10000),vector中的卡牌張數在[1,10000]。
2、我們最開始可以用vector也可以用map,來存放各個數字的卡牌各有多少張。
(筆者一開始的錯誤想法:這裡用先排序後遍歷的做法,有點傻,因為排序o(nlogn)的時間複雜度太高了,還不如直接遍歷。)
得到各個數字卡牌的張數之後,我們需要看一下是否可以分組。
這裡有個地方要注意下,比如卡牌1有4張,卡牌2有6張,是否可以分組呢?
可以的,每組2張就可以了,卡牌1有2組,卡牌2有3組。
也就是說,我們要求各種數字卡牌的張數的最大公約數,看一下最大公約數是否大於等於2。
而不能簡單地看各種數字卡牌的張數是否一致。
但是求集體的最大公約數太麻煩了,還不如直接從2開始,判斷所有數字可不可以整除2。
如果可以,那麼返回true。如果不行,看一下是否可以整除3……
繼續判斷,一直到最小的張數。
**如下:(附詳解)
bool hasgroupssizex(vector& deck)}if(flag==0)//如果遍歷了一遍,都可以整除,那麼返回true
return true;
}return false;//如果嘗試了各種數字,都不能整除,那麼返回false。
}
上述**實測8ms,beats 99.48% of cpp submissions。
這道題的乙個啟示是:如果要求很多數字的集體公約數,可以從2開始,逐個(可以的話用質數,更快)判斷能不能整除,如果某個數字大家都能整除,那麼就是集體公約數。
筆者最開始的想法是用輾轉相除法求出前兩個數的最大公約數a,接著再求第二個數和第三個數的最大公約數b,然後
求a和b的最大公約數,記為a,
接著再求第三個數和第四個數的最大公約數b,然後求a和b的最大公約數,記為a……
不斷迴圈下去,求得所有數的最大公約數,看會不會大於等於2。
這樣做似乎也可以,但是有點麻煩,之後可以嘗試一下。
leetcode 914 卡牌分組
給定一副牌,每張牌上都寫著乙個整數。每組都有 x 張牌。組內所有的牌上都寫著相同的整數。僅當你可選的 x 2 時返回 true。題解 1.把一副牌分成1組或多組 2.每組 x 張 3.組內牌上相同的整數 4.x 2,返回 true 示例 1 輸入 1,2,3,4,4,3,2,1 輸出 true解釋 ...
LeetCode 914 卡牌分組
僅當你可選的 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 解釋 沒有滿足...
LeetCode 914卡盤分組
看了官方題解如下 class solution return false 我一直在想,如果使用c語言怎麼實現 vues.add count i 這一步,也就是將count i 0 的這一部分存下來,後來參考了其他人的題解寫出的c語言的 發現真的需要將這些過濾出來麼,我不過濾直接進行遍歷不是也是可以的...