comments | difficulty | edit_url | tags | |||
---|---|---|---|---|---|---|
true |
Medium |
|
You are given a 0-indexed integer array nums
. You can apply the following operation any number of times:
- Pick any element from
nums
and put it at the end ofnums
.
The prefix sum array of nums
is an array prefix
of the same length as nums
such that prefix[i]
is the sum of all the integers nums[j]
where j
is in the inclusive range [0, i]
.
Return the minimum number of operations such that the prefix sum array does not contain negative integers. The test cases are generated such that it is always possible to make the prefix sum array non-negative.
Example 1:
Input: nums = [2,3,-5,4] Output: 0 Explanation: we do not need to do any operations. The array is [2,3,-5,4]. The prefix sum array is [2, 5, 0, 4].
Example 2:
Input: nums = [3,-5,-2,6] Output: 1 Explanation: we can do one operation on index 1. The array after the operation is [3,-2,6,-5]. The prefix sum array is [3, 1, 7, 2].
Constraints:
1 <= nums.length <= 105
-109 <= nums[i] <= 109
We use a variable
Traverse the array
The time complexity is
class Solution:
def makePrefSumNonNegative(self, nums: List[int]) -> int:
h = []
ans = s = 0
for x in nums:
s += x
if x < 0:
heappush(h, x)
while s < 0:
s -= heappop(h)
ans += 1
return ans
class Solution {
public int makePrefSumNonNegative(int[] nums) {
PriorityQueue<Integer> pq = new PriorityQueue<>();
int ans = 0;
long s = 0;
for (int x : nums) {
s += x;
if (x < 0) {
pq.offer(x);
}
while (s < 0) {
s -= pq.poll();
++ans;
}
}
return ans;
}
}
class Solution {
public:
int makePrefSumNonNegative(vector<int>& nums) {
priority_queue<int, vector<int>, greater<int>> pq;
int ans = 0;
long long s = 0;
for (int& x : nums) {
s += x;
if (x < 0) {
pq.push(x);
}
while (s < 0) {
s -= pq.top();
pq.pop();
++ans;
}
}
return ans;
}
};
func makePrefSumNonNegative(nums []int) (ans int) {
pq := hp{}
s := 0
for _, x := range nums {
s += x
if x < 0 {
heap.Push(&pq, x)
}
for s < 0 {
s -= heap.Pop(&pq).(int)
ans++
}
}
return ans
}
type hp struct{ sort.IntSlice }
func (h hp) Less(i, j int) bool { return h.IntSlice[i] < h.IntSlice[j] }
func (h *hp) Push(v any) { h.IntSlice = append(h.IntSlice, v.(int)) }
func (h *hp) Pop() any {
a := h.IntSlice
v := a[len(a)-1]
h.IntSlice = a[:len(a)-1]
return v
}
function makePrefSumNonNegative(nums: number[]): number {
const pq = new MinPriorityQueue();
let ans = 0;
let s = 0;
for (const x of nums) {
s += x;
if (x < 0) {
pq.enqueue(x);
}
while (s < 0) {
s -= pq.dequeue().element;
++ans;
}
}
return ans;
}