Given an array of integers, A of length N, find out the maximum sum sub-array of non negative numbers from A.
The sub-array should be contiguous i.e., a sub-array created by choosing the second and fourth element and skipping the third element is invalid.
Maximum sub-array is defined in terms of the sum of the elements in the sub-array.
Find and return the required subarray.
NOTE:
If there is a tie, then compare with segment's length and return segment which has maximum length.
If there is still a tie, then return the segment with minimum starting index.
Problem Constraints
1 <= N <= 105
-109 <= A[i] <= 109
Input Format
he first and the only argument of input contains an integer array A, of length N.
Output Format
Return an array of integers, that is a subarray of A that satisfies the given conditions.
Example Input
Input 1:
A = [1, 2, 5, -7, 2, 3]
Input 2:
A = [10, -1, 2, 3, -4, 100]
Example Output
Output 1:
Output 2:
Example Explanation
Explanation 1:
The two sub-arrays are [1, 2, 5] [2, 3].
The answer is [1, 2, 5] as its sum is larger than [2, 3].
Explanation 2:
The three sub-arrays are [10], [2, 3], [100].
The answer is [100] as its sum is larger than the other two.
public class Solution {
public int[] maxset(int[] A) {
int maxLen = 0;
long maxSum = 0;
int maxStart = 0;
int start = 0;
long currentSum = 0;
int currentlen = 0;
for (int i = 0; i < A.length; i++) {
if (A[i] < 0) {
if (currentSum > maxSum) {
maxSum = currentSum;
maxLen = currentlen;
maxStart = start;
} else if (currentSum == maxSum) {
if (currentlen > maxLen) {
maxLen = currentlen;
maxStart = start;
}
}
start = i + 1;
currentlen = 0;
currentSum = 0;
} else {
currentSum += (long) A[i];
currentlen++;
}
}
if (currentSum > maxSum) {
maxSum = currentSum;
maxLen = currentlen;
maxStart = start;
} else if (currentSum == maxSum) {
if (currentlen > maxLen) {
maxLen = currentlen;
maxStart = start;
}
}
int[] ans = new int[maxLen];
for (int i = maxStart; i < (maxStart + maxLen); i++)
ans[i - maxStart] = A[i];
return ans;
}
}