def SubarrayWithMaxSum(nums):
# Initialize currMax and globalMax
# with first value of nums
currMax = nums[0]
globalMax = nums[0]
# Iterate for all the elements
# of the array
for i in range(1, len(nums)):
# Update currMax
currMax = max(nums[i], nums[i] + currMax)
# Check if currMax is greater
# than globalMax
if (currMax > globalMax):
globalMax = currMax
endIndex = i
startIndex = endIndex
curGlobalMax = globalMax
# Traverse in left direction to
# find start Index of subarray
while (startIndex >= 0):
curGlobalMax -= nums[startIndex]
if (curGlobalMax == 0):
break
# Decrement the start index
startIndex -= 1
return globalMax, startIndex, endIndex
def SubarrayWithMinSum(nums):
# Initialize currMin and globalMin
# with first value of nums
currMin = nums[0]
globalMin = nums[0]
# Iterate for all the elements
# of the array
for i in range(1, len(nums)):
# Update currMin
currMin = min(nums[i], nums[i] + currMin)
# Check if currMin is greater
# than globalMin
if (currMin < globalMin):
globalMin = currMin
endIndex = i
startIndex = endIndex
currGlobalMin = globalMin
# Traverse in left direction to
# find start Index of subarray
while (startIndex >= 0):
currGlobalMin -= nums[startIndex]
if (currGlobalMin == 0):
break
# Decrement the start index
startIndex -= 1
return globalMin, startIndex, endIndex
# Given array arr[]
def printArray(nums, startIndex, endIndex):
for i in range(startIndex, endIndex + 1):
print(nums[i], end = " ")
nums = [-86, 43, -45, 68, -21]
maxSum, maxStart, maxEnd = SubarrayWithMaxSum(nums)
minSum, minStart, minEnd = SubarrayWithMinSum(nums)
if (maxSum > abs(minSum)):
printArray(nums, maxStart, maxEnd)
else:
printArray(nums, minStart, minEnd)
ZGVmIFN1YmFycmF5V2l0aE1heFN1bShudW1zKToKCiAgICAjIEluaXRpYWxpemUgY3Vyck1heCBhbmQgZ2xvYmFsTWF4CiAgICAjIHdpdGggZmlyc3QgdmFsdWUgb2YgbnVtcwogICAgY3Vyck1heCA9IG51bXNbMF0KICAgIGdsb2JhbE1heCA9IG51bXNbMF0KCiAgICAjIEl0ZXJhdGUgZm9yIGFsbCB0aGUgZWxlbWVudHMKICAgICMgb2YgdGhlIGFycmF5CiAgICBmb3IgaSBpbiByYW5nZSgxLCBsZW4obnVtcykpOgogICAgICAgIAogICAgICAgICMgVXBkYXRlIGN1cnJNYXgKICAgICAgICBjdXJyTWF4ID0gbWF4KG51bXNbaV0sIG51bXNbaV0gKyBjdXJyTWF4KQogICAgICAgIAogICAgICAgICMgQ2hlY2sgaWYgY3Vyck1heCBpcyBncmVhdGVyCiAgICAgICAgIyB0aGFuIGdsb2JhbE1heAogICAgICAgIGlmIChjdXJyTWF4ID4gZ2xvYmFsTWF4KToKICAgICAgICAgICAgZ2xvYmFsTWF4ID0gY3Vyck1heAogICAgICAgICAgICBlbmRJbmRleCA9IGkKCiAgICBzdGFydEluZGV4ID0gZW5kSW5kZXgKICAgIAogICAgY3VyR2xvYmFsTWF4ID0gZ2xvYmFsTWF4CiAgICAjIFRyYXZlcnNlIGluIGxlZnQgZGlyZWN0aW9uIHRvCiAgICAjIGZpbmQgc3RhcnQgSW5kZXggb2Ygc3ViYXJyYXkKICAgIHdoaWxlIChzdGFydEluZGV4ID49IDApOgogICAgICAgIGN1ckdsb2JhbE1heCAtPSBudW1zW3N0YXJ0SW5kZXhdCiAgICAgICAgCiAgICAgICAgaWYgKGN1ckdsb2JhbE1heCA9PSAwKToKICAgICAgICAgICAgYnJlYWsKICAgICAgICAKICAgICAgICAjIERlY3JlbWVudCB0aGUgc3RhcnQgaW5kZXgKICAgICAgICBzdGFydEluZGV4IC09IDEKICAgIAogICAgcmV0dXJuIGdsb2JhbE1heCwgc3RhcnRJbmRleCwgZW5kSW5kZXgKCmRlZiBTdWJhcnJheVdpdGhNaW5TdW0obnVtcyk6CgogICAgIyBJbml0aWFsaXplIGN1cnJNaW4gYW5kIGdsb2JhbE1pbgogICAgIyB3aXRoIGZpcnN0IHZhbHVlIG9mIG51bXMKICAgIGN1cnJNaW4gPSBudW1zWzBdCiAgICBnbG9iYWxNaW4gPSBudW1zWzBdCgogICAgIyBJdGVyYXRlIGZvciBhbGwgdGhlIGVsZW1lbnRzCiAgICAjIG9mIHRoZSBhcnJheQogICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKG51bXMpKToKICAgICAgICAKICAgICAgICAjIFVwZGF0ZSBjdXJyTWluCiAgICAgICAgY3Vyck1pbiA9IG1pbihudW1zW2ldLCBudW1zW2ldICsgY3Vyck1pbikKICAgICAgICAKICAgICAgICAjIENoZWNrIGlmIGN1cnJNaW4gaXMgZ3JlYXRlcgogICAgICAgICMgdGhhbiBnbG9iYWxNaW4KICAgICAgICBpZiAoY3Vyck1pbiA8IGdsb2JhbE1pbik6CiAgICAgICAgICAgIGdsb2JhbE1pbiA9IGN1cnJNaW4KICAgICAgICAgICAgZW5kSW5kZXggPSBpCgogICAgc3RhcnRJbmRleCA9IGVuZEluZGV4CiAgICAKICAgIGN1cnJHbG9iYWxNaW4gPSBnbG9iYWxNaW4KICAgICMgVHJhdmVyc2UgaW4gbGVmdCBkaXJlY3Rpb24gdG8KICAgICMgZmluZCBzdGFydCBJbmRleCBvZiBzdWJhcnJheQogICAgd2hpbGUgKHN0YXJ0SW5kZXggPj0gMCk6CiAgICAgICAgY3Vyckdsb2JhbE1pbiAtPSBudW1zW3N0YXJ0SW5kZXhdCiAgICAgICAgCiAgICAgICAgaWYgKGN1cnJHbG9iYWxNaW4gPT0gMCk6CiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgCiAgICAgICAgIyBEZWNyZW1lbnQgdGhlIHN0YXJ0IGluZGV4CiAgICAgICAgc3RhcnRJbmRleCAtPSAxCiAgICAKICAgIHJldHVybiBnbG9iYWxNaW4sIHN0YXJ0SW5kZXgsIGVuZEluZGV4CgojIEdpdmVuIGFycmF5IGFycltdCmRlZiBwcmludEFycmF5KG51bXMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KToKICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0SW5kZXgsIGVuZEluZGV4ICsgMSk6CiAgICAgICAgcHJpbnQobnVtc1tpXSwgZW5kID0gIiAiKQoKbnVtcyA9IFstODYsIDQzLCAtNDUsIDY4LCAtMjFdCm1heFN1bSwgbWF4U3RhcnQsIG1heEVuZCA9IFN1YmFycmF5V2l0aE1heFN1bShudW1zKQptaW5TdW0sIG1pblN0YXJ0LCBtaW5FbmQgPSBTdWJhcnJheVdpdGhNaW5TdW0obnVtcykKaWYgKG1heFN1bSA+IGFicyhtaW5TdW0pKToKICAgIHByaW50QXJyYXkobnVtcywgbWF4U3RhcnQsIG1heEVuZCkKZWxzZToKICAgIHByaW50QXJyYXkobnVtcywgbWluU3RhcnQsIG1pbkVuZCkK