สมมติว่าเรามีสำรับไพ่ ไพ่แต่ละใบมีเลขจำนวนเต็มเขียนอยู่ เราต้องตรวจสอบว่าเราสามารถเลือก 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