给你一个长度为 n
下标从 0 开始的整数数组 nums
,它包含 1
到 n
的所有数字,请你返回上升四元组的数目。
如果一个四元组 (i, j, k, l)
满足以下条件,我们称它是上升的:
0 <= i < j < k < l < n
且nums[i] < nums[k] < nums[j] < nums[l]
。
示例 1:
```txt
输入:nums = [1,3,2,4,5]
输出:2
解释:
当 i = 0 ,j = 1 ,k = 2 且 l = 3 时,有 nums[i] < nums[k] < nums[j] < nums[l] 。
当 i = 0 ,j = 1 ,k = 2 且 l = 4 时,有 nums[i] < nums[k] < nums[j] < nums[l] 。
没有其他的四元组,所以我们返回 2 。
```
示例 2:
```txt
输入:nums = [1,2,3,4]
输出:0
解释:只存在一个四元组 i = 0 ,j = 1 ,k = 2 ,l = 3 ,但是 nums[j] < nums[k] ,所以我们返回 0 。
```
提示:
4 <= nums.length <= 4000
1 <= nums[i] <= nums.length
nums
中所有数字 互不相同 ,nums
是一个排列。
统计上升四元组
题目
给你一个长度为 n
下标从 0 开始的整数数组 nums
,它包含 1
到 n
的所有数字,请你返回上升四元组的数目。
如果一个四元组 (i, j, k, l)
满足以下条件,我们称它是上升的:
-
0 <= i < j < k < l < n
且 nums[i] < nums[k] < nums[j] < nums[l]
。
示例 1:
1 | 输入:nums = [1,3,2,4,5] |
示例 2:
1 | 输入:nums = [1,2,3,4] |
提示:
-
4 <= nums.length <= 4000
-
1 <= nums[i] <= nums.length
nums
中所有数字 互不相同 ,nums
是一个排列。
题解
方法一:
思路
没想到开这么大的数组
令l[i][j]
为下标小于等于i且值小于等于j的个数, r[i][j]
下标大于等于i且值大于等于j的个数。
显然如果j!=nums[i]
,那么l[i][j]
相当于下标严格小于i且值严格小于j的个数,r[i][j]
相当于下标严格大于i且值严格大于j的个数。
以numns[i]
和nums[j]
作为中间两个元素的四元组个数为l[i][nums[j]] * r[j][nums[i]]
答案为$\sum \limits_{i=0}^{n-1} \sum \limits_{j=i+1}^{n-1} l[i][nums[j]] * r[j][nums[i]]$
总时间复杂度$O(n^2)$
代码
1 |
|