Skip to content
Merged
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 DIRECTORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,7 @@

## [Data Structures](data_structures)
* Arrays
* [Dynamic Array](data_structures/arrays/dynamic_array.py)
* [Equilibrium Index In Array](data_structures/arrays/equilibrium_index_in_array.py)
* [Find Triplets With 0 Sum](data_structures/arrays/find_triplets_with_0_sum.py)
* [Gas Station](data_structures/arrays/gas_station.py)
Expand Down
127 changes: 127 additions & 0 deletions data_structures/arrays/dynamic_array.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
class DynamicArray:
def __init__(self) -> None:
self.size = 0 # Number of elements in the array
self.capacity = 1 # Initial capacity of the array
self.array = [None] * self.capacity # Create an array with initial capacity

def append(self, item: int) -> None:
"""
The function adds an item to the end of the dynamic array.

Runtime : O(1) amortized
Space: O(1) amortized

>>> arr = DynamicArray()
>>> arr.append(1)
>>> arr.append(2)
>>> arr.append(3)
>>> arr.array[:arr.size] # Display only the filled part of the array
[1, 2, 3]
>>> arr.append(4)
>>> arr.array[:arr.size]
[1, 2, 3, 4]
>>> arr.append(5)
>>> arr.array[:arr.size]
[1, 2, 3, 4, 5]
"""
if self.size == self.capacity:
self._resize(2 * self.capacity) # Double the capacity

self.array[self.size] = item
self.size += 1

def _resize(self, new_capacity: int) -> None:
"""
Resizes the array to the new capacity.

Runtime : O(n)
Space: O(n)

>>> arr = DynamicArray()
>>> arr.append(1)
>>> arr.append(2)
>>> arr._resize(10)
>>> arr.capacity
10
>>> arr.array[:arr.size]
[1, 2]
"""
new_array = [None] * new_capacity
for i in range(self.size):
new_array[i] = self.array[i]
self.array = new_array
self.capacity = new_capacity

def get(self, index: int) -> int:
"""
The function returns the item at the specified index.

Runtime : O(1)
Space: O(1)

>>> arr = DynamicArray()
>>> arr.append(1)
>>> arr.append(2)
>>> arr.get(0)
1
>>> arr.get(1)
2
>>> arr.get(2)
Traceback (most recent call last):
...
IndexError: index out of range
>>> arr.get(-1)
Traceback (most recent call last):
...
IndexError: index out of range
"""
if index < 0 or index >= self.size:
raise IndexError("index out of range")
return self.array[index]

def __setitem__(self, index: int, value: int) -> None:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/arrays/dynamic_array.py, please provide doctest for the function __setitem__

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As there is no test file in this pull request nor any test function or class in the file data_structures/arrays/dynamic_array.py, please provide doctest for the function __setitem__

if index < 0 or index >= self.size:
raise IndexError("index out of range")
self.array[index] = value

def __len__(self) -> int:
"""
Returns the number of elements in the dynamic array.

Runtime : O(1)
Space: O(1)

>>> arr = DynamicArray()
>>> arr.append(1)
>>> len(arr)
1
>>> arr.append(2)
>>> len(arr)
2
>>> arr.append(3)
>>> len(arr)
3
"""
return self.size

def __str__(self) -> str:
"""
Returns a string representation of the dynamic array.

>>> arr = DynamicArray()
>>> arr.append(1)
>>> arr.append(2)
>>> arr.append(3)
>>> str(arr)
'[1, 2, 3]'
>>> arr.append(4)
>>> str(arr)
'[1, 2, 3, 4]'
"""
return "[" + ", ".join(str(self.array[i]) for i in range(self.size)) + "]"


if __name__ == "__main__":
import doctest

doctest.testmod()
Loading