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].
Example
Given [3,2,1,4,5], return [1,2,3,4,5] or any legal heap array.
Challenge i
O(n) time complexity
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.
public class Solution { /** * @param A: Given an integer array * @return: void */ public void heapify(int[] A) { // write your code here if(A==null || A.length==0) return; for(int i=A.length/2-1;i>=0;i--) { helper(A,i); } } public void helper(int[] A,int i) { //int left=2*i+1>=A.length?Integer.MAX_VALUE:A[2*i+1]; //int right=2*i+2>=A.length?Integer.MAX_VALUE:A[2*i+2]; int left=Integer.MAX_VALUE; int right=Integer.MAX_VALUE; if(2*i+1<A.length) { left=A[2*i+1]; } if(2*i+2<A.length) { right=A[2*i+2]; } //if left is the minimum one in left,righ and A[i].swap it with A[i]; if(left<right && left<A[i]) { A[2*i+1]=A[i]; A[i]=left; helper(A,2*i+1); } else if(right<A[i]) { A[2*i+2]=A[i]; A[i]=right; helper(A,2*i+2); } } }