มีไพ่ N ใบ แต่ละใบมีตัวเลขสองด้าน (fronts[i], backs[i]) สามารถพลิกไพ่ได้ หลังพลิกเลือกไพ่หนึ่งใบ ถ้าตัวเลขด้านหลังไม่อยู่ด้านหน้าของไพ่ใดๆ เรียกว่า "good" หาตัวเลข good ที่น้อยที่สุด
ตัวอย่าง
Input − fronts=[1,2,4,4,7], backs=[1,3,4,1,3] Output − 2
คำอธิบาย − พลิกไพ่ที่ 2: fronts=[1,3,4,4,7], backs=[1,2,4,1,3] เลือกไพ่ที่ 2 ด้านหลัง=2 ไม่อยู่ใน fronts → good
แนวทางการแก้ปัญหา
- ตัวเลขที่อยู่ทั้งสองด้านของไพ่ใดไพ่หนึ่ง (fronts[i]==backs[i]) ไม่สามารถเป็น good ได้ → ใส่ set "bad"
- หาตัวเลขน้อยที่สุดใน fronts และ backs ที่ไม่อยู่ใน bad set
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int flipgame(vector& fronts, vector& backs) {
unordered_set bad;
int n = fronts.size();
for (int i = 0; i < n; i++)
if (fronts[i] == backs[i]) bad.insert(fronts[i]);
int ans = INT_MAX;
for (int x : fronts) if (!bad.count(x)) ans = min(ans, x);
for (int x : backs) if (!bad.count(x)) ans = min(ans, x);
return ans == INT_MAX ? 0 : ans;
}
};
int main() {
vector fronts = {1,2,4,4,7};
vector backs = {1,3,4,1,3};
Solution ob;
cout << ob.flipgame(fronts, backs); // 2
return 0;
}
ผลลัพธ์
2
บทความนี้แก้ปัญหา Card Flipping Game (LeetCode 822) โดยระบุตัวเลข "bad" ที่อยู่ทั้งสองด้านไพ่เดียวกัน แล้วหาตัวเลขน้อยที่สุดที่ไม่ใช่ bad จากทั้งสองด้าน