1814. 统计一个数组中好对子的数目
解法一:哈希表应用
首先对于题目的式子 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) x−rev(x),由于哈希表里面保存的都是以前某个nums[i]+rev(nums[i])出现的次数,那么我们直接累加以前 x − r e v ( x ) x-rev(x) x−rev(x)出现次数即可。
-
时间复杂度: O ( n l o g m ) O(nlogm) O(nlogm), n为数组长度,m为数组中最大值
-
空间复杂度: O ( n ) O(n) O(n)
-
相似题目: 和为k的子数组 | 连续的子数组和统计中位数为 K 的子数组
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;
}
};
如果有问题,欢迎评论区交流, 如果有帮助到你,请给题解点个赞和收藏哈~~~