2552.统计上升四元组
题目描述:
给你一个长度为 n 下标从 0 开始的整数数组 nums ,它包含 1 到 n 的所有数字,请你返回上升四元组的数目。
如果一个四元组 (i, j, k, l) 满足以下条件,我们称它是上升的:
0 <= i < j < k < l < n 且
nums[i] < nums[k] < nums[j] < nums[l] 。
示例 1:
输入: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:
输入: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 是一个排列。
Related Topics
树状数组
数组
动态规划
枚举
前缀和
解题思路:
1.遍历数组,这种属于暴力求解,超时
2.如何优化这段代码呢?减少其中的复杂程度
思考:
是否可以先确定一个三元组?如果我们把每个位置作为中心,计算以这个数为中心能组成的三元组
一个数组cnt 数组用于记录每个位置 j 作为中心时,能够构成上升三元组 (i, j, k) 的数量
举例说明:
具体例子
给定数组 [1, 3, 2, 4, 5]:
初始化:
ans = 0
n = 5
cnt = [0, 0, 0, 0, 0]
外层循环:
l = 0:
nums[l] = 1
内层循环不执行,因为 j < l 不成立。
l = 1:
nums[l] = 3
内层循环 j = 0:
nums[j] = 1,1 < 3,所以 ans += cnt[0] = 0,idx += 1,cnt[0] += 0。
结果:ans = 0,idx = 1,cnt = [0, 0, 0, 0, 0]
l = 2:
nums[l] = 2
内层循环 j = 0:
nums[j] = 1,1 < 2,所以 ans += cnt[0] = 0,idx += 1,cnt[0] += 0。
内层循环 j = 1:
nums[j] = 3,3 >= 2,所以 cnt[1] += idx = 1。
结果:ans = 0,idx = 1,cnt = [0, 1, 0, 0, 0]
l = 3:
nums[l] = 4
内层循环 j = 0:
nums[j] = 1,1 < 4,所以 ans += cnt[0] = 0,idx += 1,cnt[0] += 0。
内层循环 j = 1:
nums[j] = 3,3 < 4,所以 ans += cnt[1] = 1,idx += 1,cnt[1] += 0。
内层循环 j = 2:
nums[j] = 2,2 < 4,所以 ans += cnt[2] = 0,idx += 1,cnt[2] += 0。
结果:ans = 1,idx = 3,cnt = [0, 1, 0, 0, 0]
l = 4:
nums[l] = 5
内层循环 j = 0:
nums[j] = 1,1 < 5,所以 ans += cnt[0] = 0,idx += 1,cnt[0] += 0。
内层循环 j = 1:
nums[j] = 3,3 < 5,所以 ans += cnt[1] = 1,idx += 1,cnt[1] += 0。
内层循环 j = 2:
nums[j] = 2,2 < 5,所以 ans += cnt[2] = 0,idx += 1,cnt[2] += 0。
内层循环 j = 3:
nums[j] = 4,4 < 5,所以 ans += cnt[3] = 0,idx += 1,cnt[3] += 0。
结果:ans = 2,idx = 4,cnt = [0, 1, 0, 0, 0]
最终结果 ans = 2,即 [3, 2, 4, 5] 和 [1, 2, 4, 5] 是两个满足条件的四元组