-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmax_non_negative _subArray.py
103 lines (90 loc) · 2.58 KB
/
max_non_negative _subArray.py
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
97
98
99
100
101
102
103
# -----------------------------------------------
# Author : Mohit Chaudhari
# Created Date : 25/07/21
# -----------------------------------------------
# ***** Max Non Negative SubArray *****
# 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:
#
# 1. If there is a tie, then compare with segment's length and return segment which has maximum length.
# 2. If there is still a tie, then return the segment with minimum starting index.
#
#
# 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.
# Constraints:
#
# 1 <= N <= 1e5
# -INT_MAX < A[i] <= INT_MAX
# Examples:
#
# Input 1:
# A = [1, 2, 5, -7, 2, 3]
#
# Output 1:
# [1, 2, 5]
#
# 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].
#
# Input 2:
# A = [10, -1, 2, 3, -4, 100]
#
# Output 2:
# [100]
#
# Explanation 2:
# The three sub-arrays are [10], [2, 3], [100].
# The answer is [100] as its sum is larger than the other two.
class Solution:
# @param A : list of integers
# @return a list of integers
def maxset(self, A):
ln = len(A)
prefix = list()
s = 0
maxi = 0
end_index = -1
start_index = -1
index = -float('inf')
si = -1
ei = -1
# FIND PREFIX SUM ARRAY
for i in range(ln):
if A[i] >= 0:
if s == -float('inf'):
s = 0
s += A[i]
else:
s = -float('inf')
if maxi < s:
maxi = s
prefix.append(s)
for i in range(ln):
if prefix[i] == maxi:
end_index = i
if start_index == -1:
start_index = i
if prefix[i] == -float('inf'):
start_index = -1
if start_index != -1 and end_index - start_index > index:
si = start_index
ei = end_index
index = end_index - start_index
return A[si:ei+1]
s = Solution()
print(s.maxset([6, -1, 3, 3, -2, 2, 2, 2]))
# OUTPUT: 2 2 2