From 35700a5200f15c7549071b8b7c639a125d1b66c0 Mon Sep 17 00:00:00 2001 From: Gokul Krishnan Date: Sun, 14 Dec 2025 22:15:15 -0800 Subject: [PATCH 1/9] added merge interval problem on the array ds --- data_structures/arrays/merge_intervals.py | 54 +++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 data_structures/arrays/merge_intervals.py diff --git a/data_structures/arrays/merge_intervals.py b/data_structures/arrays/merge_intervals.py new file mode 100644 index 000000000000..83ad13c8018c --- /dev/null +++ b/data_structures/arrays/merge_intervals.py @@ -0,0 +1,54 @@ +from typing import List + + +def merge_intervals(intervals: List[List[int]]) -> List[List[int]]: + """ + Merge all overlapping intervals. + + Each interval is represented as a list of two integers [start, end]. + The function merges overlapping intervals and returns a list of + non-overlapping intervals sorted by start time. + + Parameters: + intervals (List[List[int]]): A list of intervals. + + Returns: + List[List[int]]: A list of merged non-overlapping intervals. + + Examples: + >>> merge_intervals([[1, 3], [2, 6], [8, 10], [15, 18]]) + [[1, 6], [8, 10], [15, 18]] + >>> merge_intervals([[1, 4], [4, 5]]) + [[1, 5]] + >>> merge_intervals([[6, 8], [1, 3], [2, 4]]) + [[1, 4], [6, 8]] + >>> merge_intervals([]) + [] + >>> merge_intervals([[1, 4]]) + [[1, 4]] + + Time Complexity: + O(n log n), where n is the number of intervals (sorting step). + + Space Complexity: + O(n), for storing the merged intervals. + """ + + if not intervals: + return [] + + # Sort intervals based on the start time + intervals.sort(key=lambda interval: interval[0]) + + merged: List[List[int]] = [intervals[0]] + + for current in intervals[1:]: + last = merged[-1] + + # If current interval overlaps with the last merged interval + if current[0] <= last[1]: + last[1] = max(last[1], current[1]) + else: + merged.append(current) + + return merged From 7a27b3570099c00e1f26f85973c7264914d673fa Mon Sep 17 00:00:00 2001 From: gokul krishnan Date: Sun, 14 Dec 2025 22:26:18 -0800 Subject: [PATCH 2/9] removed typing which is deprecated --- data_structures/arrays/merge_intervals.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data_structures/arrays/merge_intervals.py b/data_structures/arrays/merge_intervals.py index 83ad13c8018c..824a88c827e8 100644 --- a/data_structures/arrays/merge_intervals.py +++ b/data_structures/arrays/merge_intervals.py @@ -1,4 +1,4 @@ -from typing import List + def merge_intervals(intervals: List[List[int]]) -> List[List[int]]: From 47d6abc7cfc8bbdb0e1c91cc49917e40de574720 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 06:26:38 +0000 Subject: [PATCH 3/9] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- data_structures/arrays/merge_intervals.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/data_structures/arrays/merge_intervals.py b/data_structures/arrays/merge_intervals.py index 824a88c827e8..6b55abe98d8f 100644 --- a/data_structures/arrays/merge_intervals.py +++ b/data_structures/arrays/merge_intervals.py @@ -1,6 +1,3 @@ - - - def merge_intervals(intervals: List[List[int]]) -> List[List[int]]: """ Merge all overlapping intervals. From 3e0cb062a89f2d90e6e0d0524b8b6dc9f9db5454 Mon Sep 17 00:00:00 2001 From: gokul krishnan Date: Sun, 14 Dec 2025 22:32:36 -0800 Subject: [PATCH 4/9] Refactor type hints in merge_intervals function Updated type hints from List to built-in list for compatibility. --- data_structures/arrays/merge_intervals.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data_structures/arrays/merge_intervals.py b/data_structures/arrays/merge_intervals.py index 6b55abe98d8f..770942832ca3 100644 --- a/data_structures/arrays/merge_intervals.py +++ b/data_structures/arrays/merge_intervals.py @@ -1,4 +1,4 @@ -def merge_intervals(intervals: List[List[int]]) -> List[List[int]]: +def merge_intervals(intervals: list[list[int]]) -> list[list[int]]: """ Merge all overlapping intervals. @@ -37,7 +37,7 @@ def merge_intervals(intervals: List[List[int]]) -> List[List[int]]: # Sort intervals based on the start time intervals.sort(key=lambda interval: interval[0]) - merged: List[List[int]] = [intervals[0]] + merged: list[list[int]] = [intervals[0]] for current in intervals[1:]: last = merged[-1] From badcbbfaed69d05bdf6db3d3e3599a4c5ea15c42 Mon Sep 17 00:00:00 2001 From: gokul krishnan Date: Mon, 15 Dec 2025 04:19:06 -0800 Subject: [PATCH 5/9] Enhance merge_intervals function documentation Added edge cases handling and updated complexity notes. --- data_structures/arrays/merge_intervals.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/data_structures/arrays/merge_intervals.py b/data_structures/arrays/merge_intervals.py index 770942832ca3..8837c9fd1eae 100644 --- a/data_structures/arrays/merge_intervals.py +++ b/data_structures/arrays/merge_intervals.py @@ -11,7 +11,15 @@ def merge_intervals(intervals: list[list[int]]) -> list[list[int]]: Returns: List[List[int]]: A list of merged non-overlapping intervals. - + + Edge Cases Handled: + - Empty list: returns [] + - Single interval: returns the interval itself + - Intervals already sorted or unsorted + - Fully overlapping intervals + - Invalid intervals (e.g., [[]] or intervals not having exactly 2 integers) raise ValueError + + Examples: >>> merge_intervals([[1, 3], [2, 6], [8, 10], [15, 18]]) [[1, 6], [8, 10], [15, 18]] @@ -25,15 +33,17 @@ def merge_intervals(intervals: list[list[int]]) -> list[list[int]]: [[1, 4]] Time Complexity: - O(n log n), where n is the number of intervals (sorting step). - + O(n log n) – sorting the intervals, where n is the number of intervals. + Space Complexity: - O(n), for storing the merged intervals. + O(n) – storing the merged intervals. """ if not intervals: return [] - + for interval in intervals: + if len(interval) != 2: + raise ValueError(f"Each interval must have exactly 2 integers, got {interval}") # Sort intervals based on the start time intervals.sort(key=lambda interval: interval[0]) From 03c20b2eec7fddca96b97ae84cb4771f0e38c0b9 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 12:19:28 +0000 Subject: [PATCH 6/9] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- data_structures/arrays/merge_intervals.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/data_structures/arrays/merge_intervals.py b/data_structures/arrays/merge_intervals.py index 8837c9fd1eae..d807c4ea7cbd 100644 --- a/data_structures/arrays/merge_intervals.py +++ b/data_structures/arrays/merge_intervals.py @@ -11,7 +11,7 @@ def merge_intervals(intervals: list[list[int]]) -> list[list[int]]: Returns: List[List[int]]: A list of merged non-overlapping intervals. - + Edge Cases Handled: - Empty list: returns [] - Single interval: returns the interval itself @@ -19,7 +19,7 @@ def merge_intervals(intervals: list[list[int]]) -> list[list[int]]: - Fully overlapping intervals - Invalid intervals (e.g., [[]] or intervals not having exactly 2 integers) raise ValueError - + Examples: >>> merge_intervals([[1, 3], [2, 6], [8, 10], [15, 18]]) [[1, 6], [8, 10], [15, 18]] @@ -34,7 +34,7 @@ def merge_intervals(intervals: list[list[int]]) -> list[list[int]]: Time Complexity: O(n log n) – sorting the intervals, where n is the number of intervals. - + Space Complexity: O(n) – storing the merged intervals. """ @@ -43,7 +43,9 @@ def merge_intervals(intervals: list[list[int]]) -> list[list[int]]: return [] for interval in intervals: if len(interval) != 2: - raise ValueError(f"Each interval must have exactly 2 integers, got {interval}") + raise ValueError( + f"Each interval must have exactly 2 integers, got {interval}" + ) # Sort intervals based on the start time intervals.sort(key=lambda interval: interval[0]) From 14d22c063bb1de0b3705e4befc6179fb5bc70253 Mon Sep 17 00:00:00 2001 From: gokul krishnan Date: Mon, 15 Dec 2025 04:27:38 -0800 Subject: [PATCH 7/9] Refactor docstring and type hints in merge_intervals Updated type hints and docstring formatting in merge_intervals function. --- data_structures/arrays/merge_intervals.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/data_structures/arrays/merge_intervals.py b/data_structures/arrays/merge_intervals.py index d807c4ea7cbd..303546e429a5 100644 --- a/data_structures/arrays/merge_intervals.py +++ b/data_structures/arrays/merge_intervals.py @@ -1,5 +1,5 @@ def merge_intervals(intervals: list[list[int]]) -> list[list[int]]: - """ + """ Merge all overlapping intervals. Each interval is represented as a list of two integers [start, end]. @@ -7,19 +7,18 @@ def merge_intervals(intervals: list[list[int]]) -> list[list[int]]: non-overlapping intervals sorted by start time. Parameters: - intervals (List[List[int]]): A list of intervals. + intervals (list[list[int]]): A list of intervals. Returns: - List[List[int]]: A list of merged non-overlapping intervals. + list[list[int]]: A list of merged non-overlapping intervals. - Edge Cases Handled: + Edge Cases Handled: - Empty list: returns [] - Single interval: returns the interval itself - Intervals already sorted or unsorted - Fully overlapping intervals - Invalid intervals (e.g., [[]] or intervals not having exactly 2 integers) raise ValueError - Examples: >>> merge_intervals([[1, 3], [2, 6], [8, 10], [15, 18]]) [[1, 6], [8, 10], [15, 18]] @@ -33,19 +32,18 @@ def merge_intervals(intervals: list[list[int]]) -> list[list[int]]: [[1, 4]] Time Complexity: - O(n log n) – sorting the intervals, where n is the number of intervals. + O(n log n) - sorting the intervals, where n is the number of intervals. Space Complexity: - O(n) – storing the merged intervals. + O(n) - storing the merged intervals. """ if not intervals: return [] for interval in intervals: + msg = f"Each interval must have exactly 2 integers, got {interval}" if len(interval) != 2: - raise ValueError( - f"Each interval must have exactly 2 integers, got {interval}" - ) + raise ValueError(msg) # Sort intervals based on the start time intervals.sort(key=lambda interval: interval[0]) From 0eaf3acf4c7964a27301d40cb7ed1e60ffb11115 Mon Sep 17 00:00:00 2001 From: gokul krishnan Date: Mon, 15 Dec 2025 04:32:38 -0800 Subject: [PATCH 8/9] Refactor merge_intervals function docstring Updated docstring formatting and improved error message clarity. --- data_structures/arrays/merge_intervals.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/data_structures/arrays/merge_intervals.py b/data_structures/arrays/merge_intervals.py index 303546e429a5..341ab9af0751 100644 --- a/data_structures/arrays/merge_intervals.py +++ b/data_structures/arrays/merge_intervals.py @@ -1,5 +1,5 @@ def merge_intervals(intervals: list[list[int]]) -> list[list[int]]: - """ + """ Merge all overlapping intervals. Each interval is represented as a list of two integers [start, end]. @@ -17,7 +17,8 @@ def merge_intervals(intervals: list[list[int]]) -> list[list[int]]: - Single interval: returns the interval itself - Intervals already sorted or unsorted - Fully overlapping intervals - - Invalid intervals (e.g., [[]] or intervals not having exactly 2 integers) raise ValueError + - Invalid intervals (e.g., [[]] or intervals not having exactly + 2 integers) raise ValueError Examples: >>> merge_intervals([[1, 3], [2, 6], [8, 10], [15, 18]]) @@ -40,10 +41,12 @@ def merge_intervals(intervals: list[list[int]]) -> list[list[int]]: if not intervals: return [] + for interval in intervals: msg = f"Each interval must have exactly 2 integers, got {interval}" if len(interval) != 2: raise ValueError(msg) + # Sort intervals based on the start time intervals.sort(key=lambda interval: interval[0]) @@ -59,3 +62,4 @@ def merge_intervals(intervals: list[list[int]]) -> list[list[int]]: merged.append(current) return merged + From 02d718984b7a4ceffc87d853201d2cc578a091f9 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 12:32:58 +0000 Subject: [PATCH 9/9] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- data_structures/arrays/merge_intervals.py | 1 - 1 file changed, 1 deletion(-) diff --git a/data_structures/arrays/merge_intervals.py b/data_structures/arrays/merge_intervals.py index 341ab9af0751..a0bbafdf7b7b 100644 --- a/data_structures/arrays/merge_intervals.py +++ b/data_structures/arrays/merge_intervals.py @@ -62,4 +62,3 @@ def merge_intervals(intervals: list[list[int]]) -> list[list[int]]: merged.append(current) return merged -