class Solution {
public:
int countBeautifulPairs(vector<int>& nums) {
// 时间复杂度:O(n * (k + logU)),k = 10,U = max(nums)
// 空间复杂度:O(k)
int ans = 0;
int cnt[10]{};// 储存最高位 1-9 的出现次数
for(int y : nums){
for(int x = 1;x < 10;x ++){
if(cnt[x] && gcd(x,y % 10) == 1){ // 存在互质
ans += cnt[x];
}
}
while(y >= 10) y /= 10;
cnt[y] ++;// 更新最高位数
}
return ans;
}
};
2.统计一个数组中好对子的数目
题目
解析
哈希表存储:nums[i] - rev(nums[i]);
本题关键点:反转数字方法(要记住);分离变量 i,j;
代码
class Solution {
int f(int x){ // 计算 nums[i] - rev(nums[i])
int rev = 0;
for (int t = x; t != 0; t /= 10) {
rev = rev * 10 + t % 10;
}
return x - rev;
}
public:
int countNicePairs(vector<int>& nums) {
// 时间复杂度:O(nlog U),U = max(nums[i])
// 空间复杂度:O(n)
int n = nums.size();
long long ans = 0;
int mod = 1e9 + 7;// 结果取模
unordered_map<int,int> cnt;
for(int j = 0;j < n;j ++){
auto it = cnt.find(f(nums[j]));
if(it != cnt.end()){
ans += cnt[f(nums[j])];
}
cnt[f(nums[j])] ++;
}
return ans % mod;
}
};
3.最佳观光组合
题目
解析
分离变量 i,j
代码
class Solution {
public:
int maxScoreSightseeingPair(vector<int>& values) {
// 时间复杂度:O(n)
// 空间复杂度:O(1)
int n = values.size();
int ans = INT_MIN;
int mx = -1e5;// values[i] + i 最大值
for(int j = 0;j < n;j ++){
ans = max(ans,mx + values[j] - j);
mx = max(mx,values[j] + j);
}
return ans;
}
};