class Solution:
def maximumSum(self, arr):
n = len(arr)
if n == 0:
return 0
max_end_here_no_del = arr[0]
max_end_here_one_del = float('-inf')
max_so_far = arr[0]
for i in range(1, n):
max_end_here_one_del = max(max_end_here_no_del, max_end_here_one_del + arr[i])
max_end_here_no_del = max(arr[i], max_end_here_no_del + arr[i])
max_so_far = max(max_so_far, max_end_here_no_del, max_end_here_one_del)
return max_so_far
class Solution {
public:
int maximumSum(vector<int>& arr) {
int n = arr.size();
int max_end_here_no_del = arr[0];
int max_end_here_one_del = INT_MIN;
int max_so_far = arr[0];
for (int i = 1; i < n; ++i) {
max_end_here_one_del = max(max_end_here_no_del, max_end_here_one_del + arr[i]);
max_end_here_no_del = max(arr[i], max_end_here_no_del + arr[i]);
max_so_far = max(max_so_far, max_end_here_no_del);
max_so_far = max(max_so_far, max_end_here_one_del);
}
return max_so_far;
}
};
class Solution {
public int maximumSum(int[] arr) {
int n = arr.length;
int maxEndHereNoDel = arr[0];
int maxEndHereOneDel = Integer.MIN_VALUE;
int maxSoFar = arr[0];
for (int i = 1; i < n; i++) {
maxEndHereOneDel = Math.max(maxEndHereNoDel, maxEndHereOneDel + arr[i]);
maxEndHereNoDel = Math.max(arr[i], maxEndHereNoDel + arr[i]);
maxSoFar = Math.max(maxSoFar, Math.max(maxEndHereNoDel, maxEndHereOneDel));
}
return maxSoFar;
}
}
var maximumSum = function(arr) {
let n = arr.length;
let maxEndHereNoDel = arr[0];
let maxEndHereOneDel = -Infinity;
let maxSoFar = arr[0];
for (let i = 1; i < n; i++) {
maxEndHereOneDel = Math.max(maxEndHereNoDel, maxEndHereOneDel + arr[i]);
maxEndHereNoDel = Math.max(arr[i], maxEndHereNoDel + arr[i]);
maxSoFar = Math.max(maxSoFar, maxEndHereNoDel, maxEndHereOneDel);
}
return maxSoFar;
};
arr
, where you may optionally delete at most one element in the subarray (but you do not have to delete any). The subarray must remain non-empty after deletion. The goal is to return the largest sum possible under these rules.arr
can be used at most once per subarray.max_end_here_no_del
: The maximum sum subarray ending at the current index without any deletion.max_end_here_one_del
: The maximum sum subarray ending at the current index with one deletion already performed.max_end_here_no_del
to arr[0]
(since the subarray must be non-empty).max_end_here_one_del
to negative infinity or a very small value (since we can't delete before index 0).max_so_far
to arr[0]
.i
(starting from 1), update the two states:
max_end_here_one_del
= max(max_end_here_no_del
, max_end_here_one_del + arr[i]
)max_end_here_no_del
= max(arr[i]
, max_end_here_no_del + arr[i]
)max_so_far
as the maximum of itself, max_end_here_no_del
, and max_end_here_one_del
.max_so_far
as the answer.
max_end_here_no_del
is just standard Kadane's.max_end_here_one_del
considers either deleting the current element (thus taking the previous max_end_here_no_del
), or extending a previous subarray where a deletion already happened.arr = [1, -2, 0, 3]
max_end_here_no_del = 1
, max_end_here_one_del = -inf
, max_so_far = 1
max_end_here_one_del = max(1, -inf + (-2)) = 1
max_end_here_no_del = max(-2, 1 + (-2)) = -1
max_so_far = max(1, -1, 1) = 1
max_end_here_one_del = max(-1, 1 + 0) = 1
max_end_here_no_del = max(0, -1 + 0) = 0
max_so_far = max(1, 0, 1) = 1
max_end_here_one_del = max(0, 1 + 3) = 4
max_end_here_no_del = max(3, 0 + 3) = 3
max_so_far = max(1, 3, 4) = 4