题目描述
给你一个整数数组 nums
和 两个 整数 l
和 r
。你的任务是找到一个长度在 l
和 r
之间(包含)且和大于 0 的 子数组 的 最小 和。
返回满足条件的子数组的 最小 和。如果不存在这样的子数组,则返回 -1。
子数组 是数组中的一个连续 非空 元素序列。
示例 1:
输入: nums = [3, -2, 1, 4], l = 2, r = 3
输出: 1
解释:
长度在 l = 2
和 r = 3
之间且和大于 0 的子数组有:
[3, -2]
和为 1
[1, 4]
和为 5
[3, -2, 1]
和为 2
[-2, 1, 4]
和为 3
其中,子数组 [3, -2]
的和为 1,是所有正和中最小的。因此,答案为 1。
示例 2:
输入: nums = [-2, 2, -3, 1], l = 2, r = 3
输出: -1
解释:
不存在长度在 l
和 r
之间且和大于 0 的子数组。因此,答案为 -1。
示例 3:
输入: nums = [1, 2, 3, 4], l = 2, r = 4
输出: 3
解释:
子数组 [1, 2]
的长度为 2,和为 3,是所有正和中最小的。因此,答案为 3。
提示:
1 <= nums.length <= 100
1 <= l <= r <= nums.length
-1000 <= nums[i] <= 1000
解法
方法一:枚举
我们可以枚举子数组的左端点 $i$,然后在 $[i, n)$ 的区间内从左往右枚举右端点 $j$,计算区间 $[i, j]$ 的和 $s$,如果 $s$ 大于 0 且区间长度在 $[l, r]$ 之间,我们就更新答案。
最后,如果答案仍然是初始值,说明没有找到符合条件的子数组,返回 $-1$,否则返回答案。
时间复杂度 $O(n^2)$,其中 $n$ 是数组 $\textit{nums}$ 的长度。空间复杂度 $O(1)$。
| class Solution:
def minimumSumSubarray(self, nums: List[int], l: int, r: int) -> int:
n = len(nums)
ans = inf
for i in range(n):
s = 0
for j in range(i, n):
s += nums[j]
if l <= j - i + 1 <= r and s > 0:
ans = min(ans, s)
return -1 if ans == inf else ans
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | class Solution {
public int minimumSumSubarray(List<Integer> nums, int l, int r) {
int n = nums.size();
final int inf = Integer.MAX_VALUE;
int ans = inf;
for (int i = 0; i < n; ++i) {
int s = 0;
for (int j = i; j < n; ++j) {
s += nums.get(j);
int k = j - i + 1;
if (k >= l && k <= r && s > 0) {
ans = Math.min(ans, s);
}
}
}
return ans == inf ? -1 : ans;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | class Solution {
public:
int minimumSumSubarray(vector<int>& nums, int l, int r) {
int n = nums.size();
const int inf = INT_MAX;
int ans = inf;
for (int i = 0; i < n; ++i) {
int s = 0;
for (int j = i; j < n; ++j) {
s += nums[j];
int k = j - i + 1;
if (k >= l && k <= r && s > 0) {
ans = min(ans, s);
}
}
}
return ans == inf ? -1 : ans;
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | func minimumSumSubarray(nums []int, l int, r int) int {
const inf int = 1 << 30
ans := inf
for i := range nums {
s := 0
for j := i; j < len(nums); j++ {
s += nums[j]
k := j - i + 1
if k >= l && k <= r && s > 0 {
ans = min(ans, s)
}
}
}
if ans == inf {
return -1
}
return ans
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | function minimumSumSubarray(nums: number[], l: number, r: number): number {
const n = nums.length;
let ans = Infinity;
for (let i = 0; i < n; ++i) {
let s = 0;
for (let j = i; j < n; ++j) {
s += nums[j];
const k = j - i + 1;
if (k >= l && k <= r && s > 0) {
ans = Math.min(ans, s);
}
}
}
return ans == Infinity ? -1 : ans;
}
|