1508. 子数组和排序后的区间和
大约 2 分钟
---
1508. 子数组和排序后的区间和
- 标签:数组、双指针、二分查找、前缀和、排序
- 难度:中等
题目链接
题目大意
描述:给定一个数组 ,包含 个正整数。计算所有非空连续子数组的和,将和排序后得到新数组 。给定 和 (-based),求 的和。
要求:返回结果对 取模。
说明:
- 。
- 。
- 。
示例:
- 示例 1:
输入:nums = [1,2,3,4], n = 4, left = 1, right = 5
输出:13
解释:所有的子数组和为 1, 3, 6, 10, 2, 5, 9, 3, 7, 4 。将它们升序排序后,我们得到新的数组 [1, 2, 3, 3, 4, 5, 6, 7, 9, 10] 。下标从 le = 1 到 ri = 5 的和为 1 + 2 + 3 + 3 + 4 = 13 。- 示例 2:
输入:nums = [1,2,3,4], n = 4, left = 3, right = 4
输出:6
解释:给定数组与示例 1 一样,所以新数组为 [1, 2, 3, 3, 4, 5, 6, 7, 9, 10] 。下标从 le = 3 到 ri = 4 的和为 3 + 3 = 6 。解题思路
思路 1:暴力
1. 核心思想
,子数组总数 。可以直接枚举所有子数组和,排序后取区间和。
2. 具体步骤
第 1 步:生成所有非空连续子数组的和。
第 2 步:排序。
第 3 步:对 求和取模。
3. 举例说明
以 为例:
所有子数组和:
- ,,,
- ,,
- ,
排序后:。
:。
思路 1:代码
class Solution:
def rangeSum(self, nums: List[int], n: int, left: int, right: int) -> int:
MOD = 10 ** 9 + 7
sub_sums = []
for i in range(n):
s = 0
for j in range(i, n):
s += nums[j]
sub_sums.append(s)
sub_sums.sort()
ans = sum(sub_sums[left - 1:right]) % MOD
return ans思路 1:复杂度分析
- 时间复杂度:,生成 个和,排序 。
- 空间复杂度:。