2763. 所有子数组中不平衡数字之和
题目描述
一个长度为 n
下标从 0 开始的整数数组 arr
的 不平衡数字 定义为,在 sarr = sorted(arr)
数组中,满足以下条件的下标数目:
0 <= i < n - 1
,和sarr[i+1] - sarr[i] > 1
这里,sorted(arr)
表示将数组 arr
排序后得到的数组。
给你一个下标从 0 开始的整数数组 nums
,请你返回它所有 子数组 的 不平衡数字 之和。
子数组指的是一个数组中连续一段 非空 的元素序列。
示例 1:
输入:nums = [2,3,1,4] 输出:3 解释:总共有 3 个子数组有非 0 不平衡数字: - 子数组 [3, 1] ,不平衡数字为 1 。 - 子数组 [3, 1, 4] ,不平衡数字为 1 。 - 子数组 [1, 4] ,不平衡数字为 1 。 其他所有子数组的不平衡数字都是 0 ,所以所有子数组的不平衡数字之和为 3 。
示例 2:
输入:nums = [1,3,3,3,5] 输出:8 解释:总共有 7 个子数组有非 0 不平衡数字: - 子数组 [1, 3] ,不平衡数字为 1 。 - 子数组 [1, 3, 3] ,不平衡数字为 1 。 - 子数组 [1, 3, 3, 3] ,不平衡数字为 1 。 - 子数组 [1, 3, 3, 3, 5] ,不平衡数字为 2 。 - 子数组 [3, 3, 3, 5] ,不平衡数字为 1 。 - 子数组 [3, 3, 5] ,不平衡数字为 1 。 - 子数组 [3, 5] ,不平衡数字为 1 。 其他所有子数组的不平衡数字都是 0 ,所以所有子数组的不平衡数字之和为 8 。
提示:
1 <= nums.length <= 1000
1 <= nums[i] <= nums.length
解法
方法一:枚举 + 有序集合
我们可以先枚举子数组的左端点 $i$,对于每个 $i$,我们从小到大枚举子数组的右端点 $j$,并且用一个有序列表维护当前子数组中的所有元素,用一个变量 $cnt$ 维护当前子数组的不平衡数字。
对于每个数字 $nums[j]$,我们在有序列表中找到第一个大于等于 $nums[j]$ 的元素 $nums[k]$,以及最后一个小于 $nums[j]$ 的元素 $nums[h]$:
- 如果 $nums[k]$ 存在,并且 $nums[k]$ 与 $nums[j]$ 的差值大于 $1$,那么不平衡数字加 $1$;
- 如果 $nums[h]$ 存在,并且 $nums[j]$ 与 $nums[h]$ 的差值大于 $1$,那么不平衡数字加 $1$;
- 如果 $nums[k]$ 存在,并且 $nums[h]$ 存在,那么将元素 $nums[j]$ 插入 $nums[h]$ 和 $nums[k]$ 的中间,会使得平衡数字减 $1$。
然后,我们将当前子数组的平衡数字累加到答案中,继续遍历,直到遍历完所有子数组。
时间复杂度 $O(n^2 \times \log n)$,空间复杂度 $O(n)$。其中 $n$ 是数组 $nums$ 的长度。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|