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 |
|
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 |
|