Daily LeetCode – day0172 1814. Count Nice Pairs in an Array

import java.util.HashMap;
import java.util.Map;

// 1814. Count Nice Pairs in an Array
class Solution {
    public int countNicePairs(int[] nums) {
        Map<Integer, Integer> selfMinusReverse = new HashMap<>();
        for (int num : nums) {
            int diff = num - reverse(num);
            selfMinusReverse.put(diff, selfMinusReverse.getOrDefault(diff, 0) + 1);
        }
        long ans = 0L;
        for (Map.Entry<Integer, Integer> entry : selfMinusReverse.entrySet()) {
            ans += (long) entry.getValue() * (entry.getValue() - 1) / 2;
        }
        return (int) (ans % 1000000007L);
    }

    private int reverse(int num) {
        int res = 0;
        while (num > 0) {
            res = res * 10 + num % 10;
            num /= 10;
        }
        return res;
    }
}
学习笔记:
这其实也算是一道写着中等题的困难题了。
看到1 <= nums.length <= 10^5就知道n^2的时间复杂度会过不去了。
那么就不能使用暴力解法。

巧妙的地方就是在于
nums[i] + rev(nums[j]) == nums[j] + rev(nums[i])
这个公式让你会觉得需要i和j两个都一起算才能知道是否相等。
移项整理后会发现
其实上只需要自己算一下差就可以了。
nums[i] - rev(nums[i]) == nums[j] - rev(nums[j])
所以就要统计一下,每个数字减自身反转后的差有多少相同,然后统计即可。

然后要注意最后是value * (value - 1) / 2这样的形式。
为什么是这样呢,因为题目规定i < j。
也就是说i不能和j一样,所以要-1。然后i和j不能调换再算一次,所以要/2。


关于樊轶群

一个善良的理想主义者。
此条目发表在每日LeetCode分类目录。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注