天天看点

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

https://leetcode-cn.com/problems/number-of-equivalent-domino-pairs/submissions/

这道题主要是边界条件多:

bool cmp(const vector<int> &a, vector<int> &b)
{
    //不能只考虑第一个元素
    if (a[0] == b[0])
        return a[1] < b[1];
    else
        return a[0] < b[0];
}

class Solution {
public:
    int numEquivDominoPairs(vector<vector<int>>& dominoes) {
        for (int i = 0; i < dominoes.size(); ++i)
        {
            if (dominoes[i][0] > dominoes[i][1])
                swap(dominoes[i][0], dominoes[i][1]);
        }
        
        sort(dominoes.begin(), dominoes.end(), cmp);
        
        int ans = 0;      
        int cnt = 1;
        for (int i = 1; i < dominoes.size(); ++i)
        {
            if (dominoes[i][0] == dominoes[i-1][0] 
                && dominoes[i][1] == dominoes[i-1][1])
            {
                ++cnt;
            }                
            else
            {
                ans += foo(cnt-1);
                cnt = 1;
            }                    
        }
        ans += foo(cnt-1);    //数组最后一个也要考虑
        
        return ans;
    }
    
    int foo(int n)
    {
        if (n==0) return 0;
        
        return (1+n)*n/2;    //这里是等差数列,不是阶乘
    }        
};