天天看點

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;    //這裡是等差數列,不是階乘
    }        
};