1814. 统计一个数组中好对子的数目

文章介绍了一种使用哈希表解决编程题目的方法,通过建立哈希表存储数组元素的反转值的出现次数,遍历数组计算每个元素与其反转值的差值,从而找到满足条件的数对。时间复杂度为O(nlogm),空间复杂度为O(n)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解法一:哈希表应用

首先对于题目的式子 i i i j j j都出现在了两边,我们将其统一移动在一方

nums[i] + rev(nums[j]) = nums[j] + rev(nums[i]) -> nums[i] - rev(nunm[i] = nums[j] - rev(nums[j]) 

那么问题就转化为:求出 ( i , j ) (i,j) (i,j)对,使得 n u m s [ i ] − r e v ( n u n m [ i ] = n u m s [ j ] − r e v ( n u m s [ j ] ) nums[i] - rev(nunm[i] = nums[j] - rev(nums[j]) nums[i]rev(nunm[i]=nums[j]rev(nums[j]), 很明显我们可以用哈希表来求解。用哈希表来保存某个数出现的次数,我们从前往后遍历数组中所有数,对于当前数x来说,我们求得 x − r e v ( x ) x-rev(x) xrev(x),由于哈希表里面保存的都是以前某个nums[i]+rev(nums[i])出现的次数,那么我们直接累加以前 x − r e v ( x ) x-rev(x) xrev(x)出现次数即可。

class Solution {
    int mod = (int)1e9 + 7;
    public int countNicePairs(int[] nums) {
        Map<Integer, Integer> mp = new HashMap<>();
        int ans = 0;
        for (int x : nums) {
            int rev = 0;
            for (int t = x; t != 0; t /= 10) rev = rev * 10 + t % 10;
            ans = (ans + mp.getOrDefault(x - rev, 0)) % mod; 
            mp.put(x - rev, mp.getOrDefault(x - rev, 0) + 1);
        }
        return ans;
    }
}
class Solution {
public:
    int countNicePairs(vector<int>& nums) {
        int mod = 1e9 + 7;
        unordered_map<int, int> mp;
        int ans = 0;
        for (int x : nums) {
            int rev = 0;
            for (int t = x; t != 0; t /= 10) rev = rev * 10 + t % 10;
            ans = (ans + mp[x - rev]) % mod; 
            mp[x - rev]++;
        }
        return ans;
    }
};

如果有问题,欢迎评论区交流, 如果有帮助到你,请给题解点个赞和收藏哈~~~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值