在桌子上有 n
张卡片,每张卡片的正面和背面都写着一个正数(正面与背面上的数有可能不一样)。
我们可以先翻转任意张卡片,然后选择其中一张卡片。
如果选中的那张卡片背面的数字 x
与任意一张卡片的正面的数字都不同,那么这个数字是我们想要的数字。
哪个数是这些想要的数字中最小的数(找到这些数中的最小值)呢?如果没有一个数字符合要求的,输出 0
。
其中, fronts[i]
和 backs[i]
分别代表第 i
张卡片的正面和背面的数字。
如果我们通过翻转卡片来交换正面与背面上的数,那么当初在正面的数就变成背面的数,背面的数就变成正面的数。
题中说,可以先翻转任意张卡片,然后再翻一张。这种题就不要想暴力了,没人会考这玩意的。那么就想一下,什么case是不满足的,如果一个卡片,正反面都是一样的数字,那怎么翻都没用,就应该排除掉这种牌,暂时就叫他废牌。自然的剩下的牌如果正面或反面有废牌中的数字,那这一面也一定是废了的。排除掉所有废牌中的数字,那剩下的数字不管怎么弄,一定可以做到一面只有他自己,我们取最小的就行了。
C++
class Solution {
public:
int flipgame(vector<int>& fronts, vector<int>& backs) {
unordered_set<int> repeat;
for(int i = 0; i < fronts.size(); i++) {
if (fronts[i] == backs[i]) {
repeat.insert(fronts[i]);
}
}
vector<int> res;
for(int i = 0; i < fronts.size(); i++) {
if (repeat.find(fronts[i]) != repeat.end() &&
repeat.find(backs[i]) != repeat.end()) {
continue;
}
if (repeat.find(fronts[i]) == repeat.end()) {
res.push_back(fronts[i]);
}
if (repeat.find(backs[i]) == repeat.end()) {
res.push_back(backs[i]);
}
}
if (res.size() > 0) {
return *min_element(res.begin(), res.end());
}
return 0;
}
};
Python
class Solution:
def flipgame(self, fronts: List[int], backs: List[int]) -> int:
if not fronts or not backs:
return 0
repeat = []
for i in range(len(fronts)):
if fronts[i] == backs[i]:
repeat.append(fronts[i])
res = []
for i in range(len(fronts)):
if fronts[i] in repeat and backs[i] in repeat:
continue
if fronts[i] not in repeat:
res.append(fronts[i])
if backs[i] not in repeat:
res.append(backs[i])
if res:
return min(res)
return 0