假设一张桌子上有N张卡,每张卡的两面都印有一个正整数(可能不同)。我们必须翻转任意数量的卡,然后选择一张卡。如果所选卡背面的数字X不在任何卡的正面,则数字X被称为良。我们必须找到最小的数字好吗?如果没有数字好,则返回0。在这里,fronts [i]和backs [i]代表卡i正面和背面的数字。翻页会交换前面和后面的数字,因此前面的值现在在后面,反之亦然。
因此,如果输入像fronts = [1,2,4,4,7]而backs = [1,3,4,1,3],那么输出将为2。因此,如果我们翻转第二张卡片,前值为[1,3,4,4,7],后值为[1,2,4,1,3]。我们将选择第二张卡片,该卡片的背面是2,而它的正面没有任何数字,因此2是一个好数字。
为了解决这个问题,我们将遵循以下步骤-
定义一个s,n:=阵线的大小,ret:= inf
对于i,范围为0至n – 1
如果fronts [i] = back [i],则将fronts [i]插入s
对于i,范围为0至n – 1
如果fronts [i]已设置,则ret:= ret和fronts [i]的最小值
对于i,范围为0至n – 1
如果backs [i]未设置,则ret:= ret和backs [i]的最小值
当ret = inf时返回0,否则返回。
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; class Solution { public: int flipgame(vector<int>& fronts, vector<int>& backs) { set <int> s; int n = fronts.size(); int ret = INT_MAX; for(int i = 0; i < n; i++){ if(fronts[i] == backs[i])s.insert(fronts[i]); } for(int i = 0; i <n; i++ ){ if(s.count(fronts[i]) == 0) ret = min(ret, fronts[i]); } for(int i = 0; i <n; i++ ){ if(s.count(backs[i]) == 0) ret = min(ret, backs[i]); } return ret == INT_MAX? 0 : ret; } }; main(){ vector<int> v1 = {1,2,4,4,7}; vector<int> v2 = {1,3,4,1,3}; Solution ob; cout << (ob.flipgame(v1, v2)); }
[1,2,4,4,7] [1,3,4,1,3]
输出结果
2