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

被折叠的 条评论
为什么被折叠?



