สมมติว่าเรามีสำรับไพ่ ไพ่แต่ละใบมีเลขจำนวนเต็มเขียนอยู่ เราต้องตรวจสอบว่าเราสามารถเลือก X>=2 ได้หรือไม่ เพื่อให้สามารถแบ่งไพ่ทั้งสำรับออกเป็น 1 กลุ่มขึ้นไป โดยที่เงื่อนไขต่อไปนี้เป็นไปตาม:แต่ละกลุ่มมีจำนวนไพ่ X เท่ากัน ไพ่ทุกใบในแต่ละกลุ่มมีเลขเท่ากัน
ดังนั้น ถ้าอินพุตเหมือนสำรับ =[1,2,3,4,4,3,2,1] ผลลัพธ์จะเป็น True เนื่องจากพาร์ติชั่นที่เป็นไปได้คือ [1,1],[2,2], [3,3],[4,4].
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดหนึ่ง mp mp
- สำหรับ x ทั้งหมดในสำรับ
- (เพิ่ม mp[x] ขึ้น 1)
- สำหรับคู่คีย์-ค่าทั้งหมด x ใน mp
- ans :=gcd ของ (และค่าของ x)
- คืนค่า จริง เมื่อ ans> 1 มิฉะนั้น เท็จ
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool hasGroupsSizeX(vector<int>& deck) {
unordered_map<int, int> mp;
int ans;
for (auto x : deck)
mp[x]++;
for (auto x : mp)
ans = __gcd(ans, x.second);
return (ans > 1);
}
};
main(){
Solution ob;
vector<int> v = {1,2,3,4,4,3,2,1};
cout << (ob.hasGroupsSizeX(v));
} อินพุต
{1,2,3,4,4,3,2,1} ผลลัพธ์
1