mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-27 15:01:08 +00:00
commit
91f03956ec
42
data_structures/arrays/kadanes_algorithm.py
Normal file
42
data_structures/arrays/kadanes_algorithm.py
Normal file
|
@ -0,0 +1,42 @@
|
|||
# Kadane's algorithm
|
||||
|
||||
|
||||
def kadanes_algorithm(arr: list[int]) -> int:
|
||||
"""
|
||||
Function to find the maximum sum of a contiguous subarray using Kadane's algorithm
|
||||
|
||||
>>> kadanes_algorithm([-2, 1, -3, 4, -1, 2, 1, -5, 4])
|
||||
6
|
||||
|
||||
>>> kadanes_algorithm([-1, -2, -3, -4])
|
||||
-1
|
||||
|
||||
>>> kadanes_algorithm([5, 4, -1, 7, 8])
|
||||
23
|
||||
|
||||
>>> kadanes_algorithm([1])
|
||||
1
|
||||
|
||||
>>> kadanes_algorithm([-1, 2, 3, -5, 4])
|
||||
5
|
||||
"""
|
||||
# initializing variables
|
||||
max_current = arr[0] # store the current max sum
|
||||
max_global = arr[0] # store the global max sum
|
||||
|
||||
# looping through the array starting at the second element
|
||||
for i in range(1, len(arr)):
|
||||
# update current max sum by choosing the maximum between
|
||||
# current element alone or current element plus previous max
|
||||
max_current = max(arr[i], max_current + arr[i])
|
||||
|
||||
# update global max sum if current max is larger
|
||||
max_global = max(max_current, max_global)
|
||||
|
||||
return max_global
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import doctest
|
||||
|
||||
doctest.testmod()
|
39
data_structures/stacks/largest_rectangle_histogram.py
Normal file
39
data_structures/stacks/largest_rectangle_histogram.py
Normal file
|
@ -0,0 +1,39 @@
|
|||
def largest_rectangle_area(heights: list[int]) -> int:
|
||||
"""
|
||||
Inputs an array of integers representing the heights of bars,
|
||||
and returns the area of the largest rectangle that can be formed
|
||||
|
||||
>>> largest_rectangle_area([2, 1, 5, 6, 2, 3])
|
||||
10
|
||||
|
||||
>>> largest_rectangle_area([2, 4])
|
||||
4
|
||||
|
||||
>>> largest_rectangle_area([6, 2, 5, 4, 5, 1, 6])
|
||||
12
|
||||
|
||||
>>> largest_rectangle_area([1])
|
||||
1
|
||||
"""
|
||||
stack: list[int] = []
|
||||
max_area = 0
|
||||
heights = [*heights, 0] # make a new list by appending the sentinel 0
|
||||
n = len(heights)
|
||||
|
||||
for i in range(n):
|
||||
# make sure the stack remains in increasing order
|
||||
while stack and heights[i] < heights[stack[-1]]:
|
||||
h = heights[stack.pop()] # height of the bar
|
||||
# if stack is empty, it means entire width can be taken from index 0 to i-1
|
||||
w = i if not stack else i - stack[-1] - 1 # calculate width
|
||||
max_area = max(max_area, h * w)
|
||||
|
||||
stack.append(i)
|
||||
|
||||
return max_area
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import doctest
|
||||
|
||||
doctest.testmod()
|
Loading…
Reference in New Issue
Block a user