Add practice problems
This commit is contained in:
parent
cd9d7cc31b
commit
c6c7b95871
59
dotfiles/lib/python/merge_sorted_linked_lists.py
Normal file
59
dotfiles/lib/python/merge_sorted_linked_lists.py
Normal file
@ -0,0 +1,59 @@
|
||||
import heapq
|
||||
|
||||
class ListNode(object):
|
||||
def __init__(self, x):
|
||||
self.val = x
|
||||
self.next = None
|
||||
|
||||
def merge_sorted_linked_lists(lists):
|
||||
min_queue = []
|
||||
result = ListNode(None)
|
||||
current_node = result
|
||||
for list_index, alist in enumerate(lists):
|
||||
if alist is None:
|
||||
continue
|
||||
heap_value = (alist.val, list_index)
|
||||
lists[list_index] = alist.next
|
||||
heapq.heappush(min_queue, heap_value)
|
||||
|
||||
while min_queue:
|
||||
value, list_index = heapq.heappop(min_queue)
|
||||
selected_list = lists[list_index]
|
||||
if selected_list is not None:
|
||||
lists[list_index] = selected_list.next
|
||||
heapq.heappush(min_queue, (selected_list.val, list_index))
|
||||
new_node = ListNode(value)
|
||||
current_node.next = new_node
|
||||
current_node = new_node
|
||||
return result.next
|
||||
|
||||
|
||||
def make_linked_list(*values):
|
||||
result = None
|
||||
for value in values[::-1]:
|
||||
new_node = ListNode(value)
|
||||
new_node.next = result
|
||||
result = new_node
|
||||
return result
|
||||
|
||||
|
||||
def linked_list_to_list(ll):
|
||||
result = []
|
||||
while ll:
|
||||
result.append(ll.val)
|
||||
ll = ll.next
|
||||
return result
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
lists = [
|
||||
make_linked_list(1, 10, 20, 21),
|
||||
make_linked_list(16, 17, 18, 22),
|
||||
make_linked_list(12, 13, 24),
|
||||
make_linked_list(-1, 15, 24),
|
||||
make_linked_list(-4),
|
||||
None,
|
||||
]
|
||||
res = merge_sorted_linked_lists(lists)
|
||||
print (linked_list_to_list(res))
|
||||
|
36
dotfiles/lib/python/quicksort.py
Normal file
36
dotfiles/lib/python/quicksort.py
Normal file
@ -0,0 +1,36 @@
|
||||
def quicksort(incoming, lower=0, upper=None):
|
||||
if upper is None:
|
||||
upper = len(incoming)
|
||||
if upper - lower < 2:
|
||||
return
|
||||
low_swap = lower
|
||||
high_swap = upper - 1
|
||||
replacing = high_swap
|
||||
pivot = incoming[high_swap]
|
||||
high_swap -= 1
|
||||
while True:
|
||||
if replacing > low_swap:
|
||||
candidate = incoming[low_swap]
|
||||
if candidate > pivot:
|
||||
incoming[replacing] = candidate
|
||||
replacing = low_swap
|
||||
if low_swap == high_swap:
|
||||
break
|
||||
low_swap += 1
|
||||
else:
|
||||
candidate = incoming[high_swap]
|
||||
if candidate < pivot:
|
||||
incoming[replacing] = candidate
|
||||
replacing = high_swap
|
||||
if low_swap == high_swap:
|
||||
break
|
||||
high_swap -= 1
|
||||
incoming[replacing] = pivot
|
||||
quicksort(incoming, lower=lower, upper=replacing)
|
||||
quicksort(incoming, lower=replacing+1, upper=upper)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
my_list = [3, 20, 2, 52, 44, 16, 24, 5, 12, 4, 1, 14, 60, 29, 33, 1]
|
||||
quicksort(my_list)
|
||||
print(my_list)
|
49
dotfiles/lib/python/skyline_problem.py
Normal file
49
dotfiles/lib/python/skyline_problem.py
Normal file
@ -0,0 +1,49 @@
|
||||
import heapq
|
||||
|
||||
|
||||
def get_skyline(buildings):
|
||||
result = []
|
||||
active_buildings = []
|
||||
|
||||
last_index = -1
|
||||
|
||||
def add_entry(index, height):
|
||||
last_height = result[-1][1] if result else 0
|
||||
if height != last_height:
|
||||
result.append([index, height])
|
||||
|
||||
def handle_next_active_building():
|
||||
(negative_height, end_index) = heapq.heappop(active_buildings)
|
||||
while active_buildings and active_buildings[0][1] <= end_index:
|
||||
heapq.heappop(active_buildings)
|
||||
new_height = -active_buildings[0][0] if active_buildings else 0
|
||||
add_entry(end_index, new_height)
|
||||
|
||||
def add_entry_for_last():
|
||||
if active_buildings:
|
||||
add_entry(last_index, -active_buildings[0][0])
|
||||
|
||||
for (left_index, right_index, height) in buildings:
|
||||
|
||||
if last_index > -1 and left_index != last_index:
|
||||
# We have to do this here inside this if statement to handle the
|
||||
# case where multiple building (potentially having different
|
||||
# heights) start on the same index.
|
||||
add_entry_for_last()
|
||||
|
||||
while active_buildings and active_buildings[0][1] < left_index:
|
||||
handle_next_active_building()
|
||||
|
||||
heapq.heappush(active_buildings, (-height, right_index))
|
||||
last_index = left_index
|
||||
|
||||
add_entry_for_last()
|
||||
|
||||
while active_buildings:
|
||||
handle_next_active_building()
|
||||
|
||||
return result
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print(get_skyline([[1,9,10],[1,7,15],[5,12,12],[15,20,10],[19,24,8], [26, 100, 100]]))
|
Loading…
Reference in New Issue
Block a user