【每日一题Day283】LC822翻转卡片游戏 | 哈希表

翻转卡片游戏【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 ) \mathcal{O}(n*C) O(nC)
      • 空间复杂度: O ( C ) \mathcal{O}(C) O(C)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值