Skip to content

psf/black changes to next_greater_element.py #1817

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Mar 28, 2020
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
72 changes: 42 additions & 30 deletions data_structures/stacks/next_greater_element.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
arr = [-10, -5, 0, 5, 5.1, 11, 13, 21, 3, 4, -21, -10, -5, -1, 0]
expect = [-5, 0, 5, 5.1, 11, 13, 21, -1, 4, -1, -10, -5, -1, 0, -1]

def next_greatest_element_slow(arr):

def next_greatest_element_slow(arr: list) -> list:
"""
Function to get Next Greatest Element (NGE) pair for all elements of list
Maximum element present afterwards the current one which is also greater than current one
>>> next_greatest_element_slow(arr)
[-5, 0, 5, 5.1, 11, 13, 21, -1, 4, -1, -10, -5, -1, 0, -1]
Get the Next Greatest Element (NGE) for all elements in a list.
Maximum element present after the current one which is also greater than the
current one.
>>> next_greatest_element_slow(arr) == expect
True
"""
result = []
for i in range(0, len(arr), 1):
Expand All @@ -18,39 +21,40 @@ def next_greatest_element_slow(arr):
return result


def next_greatest_element_fast(arr):
def next_greatest_element_fast(arr: list) -> list:
"""
Like next_greatest_element_slow() but changes the loops to use
enumerate() instead of range(len()) for the outer loop and
for in a slice of arr for the inner loop.
>>> next_greatest_element_fast(arr)
[-5, 0, 5, 5.1, 11, 13, 21, -1, 4, -1, -10, -5, -1, 0, -1]
>>> next_greatest_element_fast(arr) == expect
True
"""
result = []
for i, outer in enumerate(arr):
next = -1
for inner in arr[i + 1:]:
for inner in arr[i + 1 :]:
if outer < inner:
next = inner
break
result.append(next)
return result


def next_greatest_element(arr):
def next_greatest_element(arr: list) -> list:
"""
Function to get Next Greatest Element (NGE) pair for all elements of list
Maximum element present afterwards the current one which is also greater than current one

Naive way to solve this is to take two loops and check for the next bigger number but that will make the
time complexity as O(n^2). The better way to solve this would be to use a stack to keep track of maximum
number givig a linear time complex solution.

>>> next_greatest_element(arr)
[-5, 0, 5, 5.1, 11, 13, 21, -1, 4, -1, -10, -5, -1, 0, -1]
Get the Next Greatest Element (NGE) for all elements in a list.
Maximum element present after the current one which is also greater than the
current one.

A naive way to solve this is to take two loops and check for the next bigger
number but that will make the time complexity as O(n^2). The better way to solve
this would be to use a stack to keep track of maximum number giving a linear time
solution.
>>> next_greatest_element(arr) == expect
True
"""
stack = []
result = [-1]*len(arr)
stack = []
result = [-1] * len(arr)

for index in reversed(range(len(arr))):
if len(stack):
Expand All @@ -63,7 +67,7 @@ def next_greatest_element(arr):
result[index] = stack[-1]

stack.append(arr[index])

return result


Expand All @@ -76,11 +80,19 @@ def next_greatest_element(arr):
print(next_greatest_element_fast(arr))
print(next_greatest_element(arr))

setup = ("from __main__ import arr, next_greatest_element_slow, "
"next_greatest_element_fast, next_greatest_element")
print("next_greatest_element_slow():",
timeit("next_greatest_element_slow(arr)", setup=setup))
print("next_greatest_element_fast():",
timeit("next_greatest_element_fast(arr)", setup=setup))
print(" next_greatest_element():",
timeit("next_greatest_element(arr)", setup=setup))
setup = (
"from __main__ import arr, next_greatest_element_slow, "
"next_greatest_element_fast, next_greatest_element"
)
print(
"next_greatest_element_slow():",
timeit("next_greatest_element_slow(arr)", setup=setup),
)
print(
"next_greatest_element_fast():",
timeit("next_greatest_element_fast(arr)", setup=setup),
)
print(
" next_greatest_element():",
timeit("next_greatest_element(arr)", setup=setup),
)
16 changes: 9 additions & 7 deletions maths/allocation_number.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,19 +38,21 @@ def allocation_num(number_of_bytes: int, partitions: int) -> List[str]:
ValueError: partitions must be a positive number!
"""
if partitions <= 0:
raise ValueError('partitions must be a positive number!')
raise ValueError("partitions must be a positive number!")
if partitions >= number_of_bytes:
raise ValueError('partitions can not >= number_of_bytes!')
raise ValueError("partitions can not >= number_of_bytes!")
bytes_per_partition = number_of_bytes // partitions
allocation_list = [f'0-{bytes_per_partition}']
allocation_list = [f"0-{bytes_per_partition}"]
for i in range(1, partitions - 1):
length = f'{bytes_per_partition * i + 1}-{bytes_per_partition * (i + 1)}'
length = f"{bytes_per_partition * i + 1}-{bytes_per_partition * (i + 1)}"
allocation_list.append(length)
allocation_list.append(f'{(bytes_per_partition * (partitions - 1)) + 1}-'
f'{number_of_bytes}')
allocation_list.append(
f"{(bytes_per_partition * (partitions - 1)) + 1}-" f"{number_of_bytes}"
)
return allocation_list


if __name__ == '__main__':
if __name__ == "__main__":
import doctest

doctest.testmod()