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] 是两个满足条件的四元组

posted @ 2024-09-12 17:16  JAVA-CHENG  阅读(8)  评论(0编辑  收藏  举报