2552.统计上升四元组
基本思路:
- 以中间两个数j, k作为参考,对不同的j, k找出可行的i, l数量
- 维护两个数组
- greater[k][x],表示nums中位于k(索引)的右侧比x(数值)大的数的个数
- less[j][y],表示nums中位于j(索引)的左侧比y(数值)小的数的个数
- 数组更新方法,两层循环
- ,此处k用倒序遍历,因为累计右侧数量,需要从右侧开始计算,x遍历[1, nums[k+1])
- ,此处j用正序遍历,因为累计左侧数量,y遍历[nums[j-1], n+1)
- 结果统计
代码:
class Solution:
def countQuadruplets(self, nums: List[int]) -> int:
n = len(nums)
great=[[0]*(n+1) for _ in range(n)]
ans=0
for k in range(n-2, 1, -1):
great[k]=great[k+1][:]
for x in range(1, nums[k+1]):
great[k][x]+=1
less=[0]*(n+1)
for j in range(1,n):
for x in range(nums[j-1]+1, n+1):
less[x]+=1
for k in range(j+1, n-1):
if nums[k] < nums[j]:
ans+=less[nums[k]]*great[k][nums[j]]
return ans