14.
Chapter 14 Solutions
Written by Jonathan Sande
Heads up... You're reading this book for free, with parts of this chapter shown beyond this point as
text.
Solution to Challenge 1
There are many ways to solve for the nth smallest number in an unsorted list. This chapter is about heaps, so the solution here will use a min-heap.
num? getNthSmallestElement(int n, List<num> elements) {
var heap = Heap<num>(
elements: elements,
priority: Priority.min,
);
num? value;
for (int i = 0; i < n; i++) {
value = heap.remove();
}
return value;
}
Since heap.remove
always returns the smallest element, you just loop through n times to get the nth smallest number.
Solution to Challenge 2
Given the following unsorted list:
[21, 10, 18, 5, 3, 100, 1]
Solution to Challenge 3
To combine two heaps, add the following method to Heap
:
void merge(List<E> list) {
elements.addAll(list);
_buildHeap();
}
Solution to Challenge 4
To satisfy the min-heap requirement, every parent node must be less than or equal to its left and right child nodes.
bool isMinHeap<E extends Comparable<E>>(List<E> elements) {
// 1
if (elements.isEmpty) return true;
// 2
final start = elements.length ~/ 2 - 1;
for (var i = start; i >= 0; i--) {
// 3
final left = 2 * i + 1;
final right = 2 * i + 2;
// 4
if (elements[left].compareTo(elements[i]) < 0) {
return false;
}
// 5
if (right < elements.length &&
elements[right].compareTo(elements[i]) < 0) {
return false;
}
}
// 6
return true;
}