题目
前置题目:https://leetcode.cn/problems/number-of-good-pairs/description/
当前题目:https://leetcode.cn/problems/count-special-subsequences/description/
题解
将 \(nums[p] * nums[r] = nums[r] * nums[s]\) 变形为 \(\frac{nums[p]}{nums[q]} = \frac{nums[s]}{nums[r]}\)。
枚举 \(r\),在每次 \(r\) 右移一位的时候,仅需要用 map 维护 \(q = r - 2\) 情况下的 \(\frac{nums[p]}{nums[q]}\) 值,这步操作的总体时间复杂度是 \(O(n^2)\);并在移动之后枚举 \(\frac{nums[s]}{nums[r]}\) 在 map 中出现的次数,这步操作的时间复杂度是 \(O(n^2logn)\)。
参考代码
class Solution {
public:
long long numberOfSubsequences(vector<int>& nums) {
long long ans = 0LL;
int n = nums.size();
map<double, int> mp;
for (int i = 4; i < n; ++ i) {
for (int j = i - 4; j >= 0; -- j) {
mp[1.0 * nums[j] / nums[i - 2]] ++;
}
for (int j = i + 2; j < n; ++ j) {
ans += mp[1.0 * nums[j] / nums[i]];
}
}
return ans;
}
};
标签:map,frac,nums,int,long,枚举,3404,LeetCode
From: https://www.cnblogs.com/RomanLin/p/18644034