题目:堆化

来源:互联网 发布:女朋友突然说分手 知乎 编辑:程序博客网 时间:2024/05/21 17:58


给出一个整数数组,堆化操作就是把它变成一个最小堆数组。

对于堆数组A,A[0]是堆的根,并对于每个A[i],A [i * 2 + 1]是A[i]的左儿子并且A[i * 2 + 2]是A[i]的右儿子。

您在真实的面试中是否遇到过这个题?

Yes





样例

给出 [3,2,1,4,5],返回[1,2,3,4,5] 或者任何一个合法的堆数组

挑战

O(n)的时间复杂度完成堆化

说明

什么是堆?

•堆是一种数据结构,它通常有三种方法:push, pop 和 top。其中,“push”添加新的元素进入堆,“pop”删除堆中最小/最大元素,“top”返回堆中最小/最大元素。


什么是堆化?

•把一个无序整数数组变成一个堆数组。如果是最小堆,每个元素A[i],我们将得到A[i * 2 + 1] >= A[i]和A[i  * 2 + 2] >= A[i]


如果有很多种堆化的结果?

•返回其中任何一个。


标签 Expand   

解题思路:标准的堆排序,http://blog.csdn.net/morewindows/article/details/6709644/   这个博客可以看看堆排序讲的透彻

public class Solution {    /**     * @param A: Given an integer array     * @return: void     */    public void heapify(int[] A) {        // write your code here        if(null==A||0==A.length) return;         int len  = A.length;         for(int i=len/2-1;i>=0;i--){              minHeapDown(A, i, len);         }            }       public void minHeapDown(int[] A,int i,int len){              int j = i*2+1;              int tmp;              while(j<len){                   if(j+1<len&&A[j]>A[j+1]){                        j++;                   }                   if(A[j]>A[i]){                        break;                   }                   tmp = A[i];                   A[i] = A[j];                   A[j] = tmp;                   i = j;                   j = i*2+1;              }                 }}

0 0
原创粉丝点击