leetcode 914 卡牌分組

2022-08-24 17:54:11 字數 1851 閱讀 7191

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

僅當你可選的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

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語言的 發現真的需要將這些過濾出來麼,我不過濾直接進行遍歷不是也是可以的...