-
Notifications
You must be signed in to change notification settings - Fork 0
/
Max Non Negative SubArray
96 lines (59 loc) · 1.91 KB
/
Max Non Negative SubArray
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/*
Problem Description
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
The 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:
[1, 2, 5]
Output 2:
[100]
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.
*/
vector<int> Solution::maxset(vector<int> &A) {
long long int Max = 0;
long long int cur_max = 0;
int start = -1; int end = -1; int s = 0; int e = 0;
for (int i = 0; i < A.size(); ++i){
if (A[i] < 0){
s = i + 1;
cur_max = 0;
} else {
cur_max += A[i];
if (Max < cur_max || (Max == cur_max && ((end - start) < (e - s) ) )){
Max = cur_max;
start = s;
end = e;
}
}
e++;
}
vector<int> res;
if(start == -1) return res;
for (int i = start; i <= end ; ++i){
res.push_back(A[i]);
}
return res;
}