翻转卡片游戏【LC822】
在桌子上有 N 张卡片,每张卡片的正面和背面都写着一个正数(正面与背面上的数有可能不一样)。
我们可以先翻转任意张卡片,然后选择其中一张卡片。
如果选中的那张卡片背面的数字 X 与任意一张卡片的正面的数字都不同,那么这个数字是我们想要的数字。
哪个数是这些想要的数字中最小的数(找到这些数中的最小值)呢?如果没有一个数字符合要求的,输出 0。
其中, fronts[i] 和 backs[i] 分别代表第 i 张卡片的正面和背面的数字。
如果我们通过翻转卡片来交换正面与背面上的数,那么当初在正面的数就变成背面的数,背面的数就变成正面的数。
思路
如果某个数同时出现在一张卡片的正面或者反面,那么这个数字一定不是我们想要的数字。因此遍历数组,使用哈希表记录这些数字,再次遍历找到出现过但未同时出现的数字
实现
使用数组代替哈希表,
初始为0,表示没有出现过该数字
值为1时表示这个数字是我们想要的数字
值为2时表示这个数字不是我们想要的数字
class Solution { public int flipgame(int[] fronts, int[] backs) { int n = fronts.length; int[] flag = new int[2001]; for (int i = 0; i < n; i++){ if (fronts[i] == backs[i]){ flag[fronts[i]] = 2; }else{ flag[fronts[i]] = Math.max(flag[fronts[i]], 1); flag[backs[i]] = Math.max(flag[backs[i]], 1); } } for (int i = 1; i <= 2000;i++){ if (flag[i] == 1){ return i; } } return 0; } }
复杂度
时间复杂度:O ( n ∗ C )
空间复杂度:O ( C )