【LeetCode】每日一题 1814.统计一个数组中好对子的数目

题目描述:

【LeetCode】每日一题 1814.统计一个数组中好对子的数目_第1张图片

思路

  1. 由 nums[i] + rev(nums[j]) == nums[j] + rev(nums[i]) 
    可知,nums[i] - rev(nums[i]) == nums[j] - rev(nums[j])
    即,若f(x) = nums[x] - rev(nums[x]) ,则f(i)=f(j) 时,下标对为好对子。
  2. 哈希表记录相同的 f(x) 值。
    由组合公式可得ans=ans+\frac{H(x)\cdot (H(x)-1)}{2} ,其中,ans为答案值,H(x) 为哈希表中 key=f(x) 时的value。

代码(C++)

class Solution {
public:
    int mod = 1e9 + 7;
    int countNicePairs(vector& nums) {
        unordered_mapss;
        long long ans = 0;
        int s = nums.size();
        for (auto i:nums) {
            int r = 0;
            for (int t = i; t != 0; t /= 10) {
                r = r * 10 + t % 10;
            }
            ss[i - r]++;
        }
        for (auto i : ss) {
            int second = i.second;
            if (second > 1) {
                ans += ((long long)second * (second - 1)) / 2;
            }
        }
        return ans % mod;
    }
};

用auto会比自己写for用时少

此处不用将rev写成函数,写成函数只会增加用时。

思考

题目中有:由于结果可能会很大,请将结果对10^{9}+7 取余 后返回。

为什么?

因为它是个质数。

  1. 对质数取模的话,能尽可能地避免模数相同的数之间具备公因数,来达到减少冲突的目的。
  2. 模素数p的环是无零因子环,也就是说两个非p倍数的数相乘再模p不会是零。出题人希望通过这样减少答题者蒙对的概率(?)

出处:为什么对1e9+7取模

你可能感兴趣的:(leetcode,算法)