Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ repos:
rev: "v2.5.0"
hooks:
- id: pyproject-fmt
language_version: python3.12

- repo: local
hooks:
Expand Down
56 changes: 56 additions & 0 deletions data_structures/arrays/kadanes_algorithm.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
class KadaneAlgorithm:
"""
Kadane's Algorithm to find the maximum sum
of a contiguous subarray in a given array.

Time Complexity: O(n)
Space Complexity: O(1)

The function works efficiently with both positive and negative integers.

Usage:
>>> kadane = KadaneAlgorithm()
>>> kadane.max_subarray_sum([1, 2, 3, -2, 5])
9
>>> kadane.max_subarray_sum([-1, -2, -3, -4])
-1
>>> kadane.max_subarray_sum([1, 2, 3, 4])
10
>>> kadane.max_subarray_sum([10, -10, 20, -5, 10])
25
"""

def __init__(self):
pass

def max_subarray_sum(self, arr: list[int]) -> int:
"""
This function finds the maximum sum of a
contiguous subarray using Kadane's Algorithm.

:param arr: List of integers.
:return: Maximum sum of a contiguous subarray.

Raises:
ValueError: If the input array is empty.

>>> kadane = KadaneAlgorithm()
>>> kadane.max_subarray_sum([1, 2, 3, -2, 5])
9
>>> kadane.max_subarray_sum([-1, -2, -3, -4])
-1
>>> kadane.max_subarray_sum([1, 2, 3, 4])
10
>>> kadane.max_subarray_sum([10, -10, 20, -5, 10])
25
"""
if not arr:
raise ValueError("Input array cannot be empty.")

max_sum = current_sum = arr[0]

for num in arr[1:]:
current_sum = max(num, current_sum + num)
max_sum = max(max_sum, current_sum)

return max_sum
45 changes: 24 additions & 21 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,30 @@ euler-validate = [
[tool.ruff]
target-version = "py313"

[tool.codespell]
ignore-words-list = "3rt,ans,bitap,crate,damon,fo,followings,hist,iff,kwanza,manuel,mater,secant,som,sur,tim,toi,zar"
skip = "./.*,*.json,*.lock,ciphers/prehistoric_men.txt,project_euler/problem_022/p022_names.txt,pyproject.toml,strings/dictionary.txt,strings/words.txt"

[tool.pytest.ini_options]
markers = [
"mat_ops: mark a test as utilizing matrix operations.",
]
addopts = [
"--durations=10",
"--doctest-modules",
"--showlocals",
]

[tool.coverage.report]
omit = [
".env/*",
"project_euler/*",
]
sort = "Cover"

[tool.mypy]
python_version = "3.12"

output-format = "full"
lint.select = [
# https://beta.ruff.rs/docs/rules
Expand Down Expand Up @@ -158,27 +182,6 @@ lint.pylint.max-branches = 20 # default: 12
lint.pylint.max-returns = 8 # default: 6
lint.pylint.max-statements = 88 # default: 50

[tool.codespell]
ignore-words-list = "3rt,ans,bitap,crate,damon,fo,followings,hist,iff,kwanza,manuel,mater,secant,som,sur,tim,toi,zar"
skip = "./.*,*.json,*.lock,ciphers/prehistoric_men.txt,project_euler/problem_022/p022_names.txt,pyproject.toml,strings/dictionary.txt,strings/words.txt"

[tool.pytest.ini_options]
markers = [
"mat_ops: mark a test as utilizing matrix operations.",
]
addopts = [
"--durations=10",
"--doctest-modules",
"--showlocals",
]

[tool.coverage.report]
omit = [
".env/*",
"project_euler/*",
]
sort = "Cover"

[tool.sphinx-pyproject]
copyright = "2014, TheAlgorithms"
autoapi_dirs = [
Expand Down
Loading