diff --git a/dynamic_programming/max_sub_array_sum.py b/dynamic_programming/max_sub_array_sum.py new file mode 100644 index 000000000000..a9eeef039b7b --- /dev/null +++ b/dynamic_programming/max_sub_array_sum.py @@ -0,0 +1,44 @@ +from typing import List + +def max_sub_array_sum(arr: List[int], size: int) -> int: + """ + Finds the maximum sum of a subarray within the given array using Kadane's algorithm. + + Args: + arr (list): The input array of numbers. + size (int): The size of the array. + + Returns: + int: The maximum sum of a subarray within the array. + + Example: + >>> arr = [-2, -3, 4, -1, -2, 5, -3] + >>> maxSubArraySum(arr, len(arr)) + 6 + In this example, the input array is [-2, -3, 4, -1, -2, 5, -3]. The maximum sum of a subarray + within this array is 6, which corresponds to the subarray [4, -1, -2, 5]. + + >>> arr = [-3, -4, 5, -1, 2, -4, 6, -1] + >>> maxSubArraySum(arr, len(arr)) + 8 + + References: + https://en.wikipedia.org/wiki/Maximum_subarray_problem + """ + max_till_now = arr[0] + max_ending = 0 + + for i in range(size): + max_ending = max_ending + arr[i] + if max_ending < 0: + max_ending = 0 + elif max_till_now < max_ending: + max_till_now = max_ending + + return max_till_now + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/web_programming/sliding_window.py b/web_programming/sliding_window.py new file mode 100644 index 000000000000..410488046926 --- /dev/null +++ b/web_programming/sliding_window.py @@ -0,0 +1,38 @@ +from typing import List + +def sliding_window(elements: List[int], window_size: int) -> List[List[int]]: + """ + Generate sliding windows of a specified size over a list of elements. + + Args: + elements (list): The input list of elements. + window_size (int): The size of the sliding window. + + Returns: + list: A list of sliding windows. + + Example: + >>> lst = [1, 2, 3, 4, 5, 6, 7, 8] + >>> result = sliding_window(lst, 3) + >>> print(result) + [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8]] + + References: + https://stackoverflow.com/questions/8269916/what-is-sliding-window-algorithm-examples + """ + + if len(elements) <= window_size: + return [elements] + + windows = [] + for i in range(len(elements) - window_size + 1): + window = elements[i : i + window_size] + windows.append(window) + + return windows + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/web_programming/sliding_window_using_generators.py b/web_programming/sliding_window_using_generators.py new file mode 100644 index 000000000000..481e5e2bfaf0 --- /dev/null +++ b/web_programming/sliding_window_using_generators.py @@ -0,0 +1,34 @@ +from typing import List + +def sliding_window(elements: List[int], window_size: int) -> List[List[int]]: + """ + Generate sliding windows of size window_size from the given elements. + + Args: + elements (list): The input list of elements. + window_size (int): The size of the sliding window. + + Returns: + generator: A generator that yields sublists of size window_size. + + Example: + >>> lst = [1, 2, 3, 4, 5, 6, 7, 8] + >>> sw_gen = sliding_window(lst, 3) + >>> print(next(sw_gen)) + [1, 2, 3] + >>> print(next(sw_gen)) + [2, 3, 4] + + References: + https://stackoverflow.com/questions/8269916/what-is-sliding-window-algorithm-examples + """ + if len(elements) <= window_size: + return elements + for i in range(len(elements) - window_size + 1): + yield elements[i : i + window_size] + + +if __name__ == "__main__": + import doctest + + doctest.testmod()