
题目描述
给定一个数组 nums
。一个数组被认为是 正 的,如果每个包含 超过两个 元素的 子数组 的所有数字之和都是正数。
您可以执行以下操作任意多次:
- 用 -1018 和 1018 之间的任意整数替换
nums
中的 一个 元素。
找到使 nums
变为正数组所需的最小操作数。
示例 1:
输入:nums = [-10,15,-12]
输出:1
解释:
唯一有超过 2 个元素的子数组是这个数组本身。所有元素的和是 (-10) + 15 + (-12) = -7
。通过将 nums[0]
替换为 0,新的和变为 0 + 15 + (-12) = 3
。因此,现在数组是正的。
示例 2:
输入:nums = [-1,-2,3,-1,2,6]
输出:1
解释:
具有 2 个以上元素且和非正的子数组是:
子数组下标 |
子数组 |
和 |
替换后的子数组(令 nums[1] = 1) |
新的和 |
nums[0...2] |
[-1, -2, 3] |
0 |
[-1, 1, 3] |
3 |
nums[0...3] |
[-1, -2, 3, -1] |
-1 |
[-1, 1, 3, -1] |
2 |
nums[1...3] |
[-2, 3, -1] |
0 |
[1, 3, -1] |
3 |
因此,nums
在一次操作后是正的。
示例 3:
输入:nums = [1,2,3]
输出:0
解释:
数组已经是正的,所以不需要操作。
提示:
3 <= nums.length <= 105
-109 <= nums[i] <= 109
解法
方法一
1
2
3
4
5
6
7
8
9
10
11
12
13 | class Solution:
def makeArrayPositive(self, nums: List[int]) -> int:
l = -1
ans = pre_mx = s = 0
for r, x in enumerate(nums):
s += x
if r - l > 2 and s <= pre_mx:
ans += 1
l = r
pre_mx = s = 0
elif r - l >= 2:
pre_mx = max(pre_mx, s - x - nums[r - 1])
return ans
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | class Solution {
public int makeArrayPositive(int[] nums) {
int ans = 0;
long preMx = 0, s = 0;
for (int l = -1, r = 0; r < nums.length; r++) {
int x = nums[r];
s += x;
if (r - l > 2 && s <= preMx) {
ans++;
l = r;
preMx = s = 0;
} else if (r - l >= 2) {
preMx = Math.max(preMx, s - x - nums[r - 1]);
}
}
return ans;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | class Solution {
public:
int makeArrayPositive(vector<int>& nums) {
int ans = 0;
long long preMx = 0, s = 0;
for (int l = -1, r = 0; r < nums.size(); r++) {
int x = nums[r];
s += x;
if (r - l > 2 && s <= preMx) {
ans++;
l = r;
preMx = s = 0;
} else if (r - l >= 2) {
preMx = max(preMx, s - x - nums[r - 1]);
}
}
return ans;
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | func makeArrayPositive(nums []int) (ans int) {
l := -1
preMx := 0
s := 0
for r, x := range nums {
s += x
if r-l > 2 && s <= preMx {
ans++
l = r
preMx = 0
s = 0
} else if r-l >= 2 {
preMx = max(preMx, s-x-nums[r-1])
}
}
return
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | function makeArrayPositive(nums: number[]): number {
let l = -1;
let [ans, preMx, s] = [0, 0, 0];
for (let r = 0; r < nums.length; r++) {
const x = nums[r];
s += x;
if (r - l > 2 && s <= preMx) {
ans++;
l = r;
preMx = 0;
s = 0;
} else if (r - l >= 2) {
preMx = Math.max(preMx, s - x - nums[r - 1]);
}
}
return ans;
}
|