题目:2552. 统计上升四元组
思路:枚举j,k两个下标,时间复杂度0(n^2),细节看注释。
class Solution {
public:
long long countQuadruplets(vector<int>& nums) {
int n=nums.size();
//状态pre[x]表示:在数组nums[0,j-1]区间,有多少个小于x的元素
vector<int> pre(n+1,0);
//记录答案
long long cnt=0;
//第一层枚举j,从前往后
for(int j=0;j<n;j++){
//记录第二层枚举k遍历过后的区间[k,n-1]中,有多少个元素大于nums[j]
long long ans=0;
//第二层枚举k,从后往前
for(int k=n-1;k>j;k--){
//nums[j]>nums[k]时,计算符合要求的四元组
if(nums[j]>nums[k]){
cnt+=ans*(pre[nums[k]]);
}else{
//这里没排除nums[j]==nums[k]的情况,是因为元素不会重复
ans++;
}
}
//更新当前数组pre大于nums[j]的元素值情况
for(int i=nums[j]+1;i<=n;i++){
pre[i]++;
}
}
return cnt;
}
};