Leetcode第49场双周赛 统计一个数组中好对子的数目

本文介绍了一种高效的算法来解决题目中的'好对子'问题,通过观察数对的性质,利用映射减少时间复杂度,避免了O(n^2)的暴力搜索。核心在于发现x-rev(x)=y-rev(y),并通过map存储差值及其出现次数,最终计算所有符合条件的'好对子'总数。

注意观察问题的本质:如果两个数x,y能组成“好对子”,那么根据“好对子”的定义有x + rev(y) = rev(x) + y。如果暴力地在nums中搜索每一个x所能匹配的y,时间复杂度将会是O(n^2),对于本题来讲会导致超时。我们可以将x + rev(y) = rev(x) + y变形,得到x - rev(x) = y - rev(y)。这个式子告诉我们,两个数能组成“好对子”,当且仅当他们自身与其反转数的差相等。建立一个map,其key为一个数本身与其反转数的差,value为nums中符合key条件的数的数目。最后遍历这个map,求出每个key所对应的“好对子”的数目,累加即为nums中所有好对子的数目。

class Solution {
public:
    int Rev(int x) {
        int ans = 0;
        while (x != 0) {
            ans *= 10;
            ans += x % 10;
            x /= 10;
        }
        return ans;
    }
    int countNicePairs(vector<int>& nums) {
        map<long int, long int> diff;
        map<long int, long int>::iterator ite;
        int ans = 0;
        for (int i = 0; i < nums.size(); i++) {
            int k = nums[i] - Rev(nums[i]);
            ite = diff.find(k);
            if (ite == diff.end()) diff.insert(pair<long int, long int> (k, 1));
            else ite->second++;
        }
        for (ite = diff.begin(); ite != diff.end(); ++ite) {
            int k = (ite->second) * (ite->second - 1) / 2 % 1000000007;
            ans = (ans + k) % 1000000007;
        }
        return ans;
    }
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值