LeetCode 每日一题 2020-1-26(等价多米诺骨牌对的数量)

1128. 等价多米诺骨牌对的数量

难度简单

给你一个由一些多米诺骨牌组成的列表 dominoes

如果其中某一张多米诺骨牌可以通过旋转 0 度或 180 度得到另一张多米诺骨牌,我们就认为这两张牌是等价的。

形式上,dominoes[i] = [a, b] 和 dominoes[j] = [c, d] 等价的前提是 a==c 且 b==d,或是 a==d 且 b==c

在 0 <= i < j < dominoes.length 的前提下,找出满足 dominoes[i] 和 dominoes[j] 等价的骨牌对 (i, j) 的数量。

思路一:

简单的暴力比较,当前数字和前一个后续的全部数字比较   算法用例超时

改进:一旦某类数据匹配完成,与当前数据等价的后续全部数据应该不参与比较

int numEquivDominoPairs(vector<vector<int>>& dominoes) {
    int ans=0,len=dominoes.size();
    int data[len];
    memset(data,0,sizeof(data));
    for(int i=0;i<len;++i){
        if(data[i]) continue;
        ans=0;
        for(int j=i+1;j<len;++j){
            if((dominoes[i][0]==dominoes[j][0] && dominoes[i][1]==dominoes[j][1]) || 
                (dominoes[i][0]==dominoes[j][1] && dominoes[i][1]==dominoes[j][0])){
                    data[j]=++ans;
                }
        }
    }
    ans=0;
    for(auto& index:data){
        ans+=index;
    }
    return ans;
}

 思路二:

各数据的均属于 0~9 之间,两个数字可组成 00~99 之间的全部数据,匹配的数据项应当相等或者相反

对数据预处理:根据将两个数字组成最小的两位数,可确保某各匹配项的全部数据相等

从第一个数据开始,每个数字匹配的数量依次递减 n-1~0 ,反转后匹配的数字可之间逆序处理即:0~n-1

int numEquivDominoPairs(vector<vector<int>>& dominoes) {
    int ans=0,len=dominoes.size(),temp=0;
    int data[100];
    memset(data,0,sizeof(data));
    for(auto& index:dominoes){
        temp=index[0]<index[1]? index[0]*10+index[1]: index[1]*10+index[0];
        ans += data[temp]++;
    }
    return ans;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值