ปัญหา
สมมติว่าเรามีสำรับไพ่ แต่ละใบมีจำนวนเต็มเขียนอยู่ เราต้องตรวจสอบว่าสามารถเลือก X >= 2 ได้หรือไม่ โดยที่สามารถแบ่งสำรับทั้งหมดเป็น 1 หรือหลายกลุ่มของไพ่ได้ โดยเงื่อนไขต่อไปนี้: แต่ละกลุ่มมีจำนวนไพ่เท่ากับ X ใบพอดี ไพ่ทั้งหมดในแต่ละกลุ่มมีตัวเลขเดียวกัน
เช่น ถ้าผนวกเข้าเป็น deck = [1,2,3,4,4,3,2,1] ผลลัพธ์จะเป็น True เนื่องจากแบ่งได้เป็น [1,1],[2,2],[3,3],[4,4]
วิธีแก้ปัญหา
- กำหนด map mp หนึ่งอัน
- for ทุก x ใน deck: เพิ่ม mp[x] ขึ้น 1
- for ทุกคู่ key-value x ใน mp: ans := gcd ของ (ans และ value ของ x)
- คืนค่า true เมื่อ ans > 1 มิฉะนั้น false
ตัวอย่างโค้ด C++
#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);
}
};
int 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