Heapify:

lintcode problem.

Given an integer array, heapify it into a min-heap array.

For a heap array A, A[0] is the root of heap, and for each A[i], A[i * 2 + 1] is the left child of A[i] and A[i * 2 + 2] is the right child of A[i].

Clarification

What is heap?

  • Heap is a data structure, which usually have three methods: push, pop and top. where "push" add a new element the heap, "pop" delete the minimum/maximum element in the heap, "top" return the minimum/maximum element.

What is heapify?

  • Convert an unordered integer array into a heap array. If it is min-heap, for each element A[i], we will get A[i * 2 + 1] >= A[i] and A[i * 2 + 2] >= A[i].

What if there is a lot of solutions?

  • Return any of them.

Example

Given [3,2,1,4,5], return [1,2,3,4,5] or any legal heap array.

Solution:

Build Heap Implementation

class Solution:
    # @param A: Given an integer array
    # @return: void
    def heapify(self, A):

        # write your code here
        n = len(A)
        for i in range((n-2)/2, -1, -1):
                self.correctHeap(A, i)

    def left(self, i):
        return 2*i + 1
    def right(self, i):
        return 2*i + 2

    def correctHeap(self, A, i):
        n = len(A)
        if i > (n-2)/2:
            return

        if self.right(i) < n:
            if A[i] > A[self.left(i)] or A[i] > A[self.right(i)]:
                if A[self.left(i)] <= A[self.right(i)]:
                    A[i], A[self.left(i)] = A[self.left(i)], A[i]
                    self.correctHeap(A, self.left(i))
                else:
                    A[i], A[self.right(i)] = A[self.right(i)], A[i]
                    self.correctHeap(A, self.right(i))
        else:
            if A[i] > A[self.left(i)]:
                A[i], A[self.left(i)] = A[self.left(i)], A[i]

results matching ""

    No results matching ""