mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-30 16:31:08 +00:00
7f1a5521f4
* add prefix sum * updating DIRECTORY.md * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci Co-authored-by: github-actions <${GITHUB_ACTOR}@users.noreply.github.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
79 lines
1.9 KiB
Python
79 lines
1.9 KiB
Python
"""
|
|
Author : Alexander Pantyukhin
|
|
Date : November 3, 2022
|
|
|
|
Implement the class of prefix sum with useful functions based on it.
|
|
|
|
"""
|
|
|
|
|
|
class PrefixSum:
|
|
def __init__(self, array: list[int]) -> None:
|
|
len_array = len(array)
|
|
self.prefix_sum = [0] * len_array
|
|
|
|
if len_array > 0:
|
|
self.prefix_sum[0] = array[0]
|
|
|
|
for i in range(1, len_array):
|
|
self.prefix_sum[i] = self.prefix_sum[i - 1] + array[i]
|
|
|
|
def get_sum(self, start: int, end: int) -> int:
|
|
"""
|
|
The function returns the sum of array from the start to the end indexes.
|
|
Runtime : O(1)
|
|
Space: O(1)
|
|
|
|
>>> PrefixSum([1,2,3]).get_sum(0, 2)
|
|
6
|
|
>>> PrefixSum([1,2,3]).get_sum(1, 2)
|
|
5
|
|
>>> PrefixSum([1,2,3]).get_sum(2, 2)
|
|
3
|
|
>>> PrefixSum([1,2,3]).get_sum(2, 3)
|
|
Traceback (most recent call last):
|
|
...
|
|
IndexError: list index out of range
|
|
"""
|
|
if start == 0:
|
|
return self.prefix_sum[end]
|
|
|
|
return self.prefix_sum[end] - self.prefix_sum[start - 1]
|
|
|
|
def contains_sum(self, target_sum: int) -> bool:
|
|
"""
|
|
The function returns True if array contains the target_sum,
|
|
False otherwise.
|
|
|
|
Runtime : O(n)
|
|
Space: O(n)
|
|
|
|
>>> PrefixSum([1,2,3]).contains_sum(6)
|
|
True
|
|
>>> PrefixSum([1,2,3]).contains_sum(5)
|
|
True
|
|
>>> PrefixSum([1,2,3]).contains_sum(3)
|
|
True
|
|
>>> PrefixSum([1,2,3]).contains_sum(4)
|
|
False
|
|
>>> PrefixSum([1,2,3]).contains_sum(7)
|
|
False
|
|
>>> PrefixSum([1,-2,3]).contains_sum(2)
|
|
True
|
|
"""
|
|
|
|
sums = {0}
|
|
for sum_item in self.prefix_sum:
|
|
if sum_item - target_sum in sums:
|
|
return True
|
|
|
|
sums.add(sum_item)
|
|
|
|
return False
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import doctest
|
|
|
|
doctest.testmod()
|