LintCode 堆化详解及实例代码

 更新时间:2017年04月25日 10:24:03   投稿:lqh  
这篇文章主要介绍了LintCode 堆化详解及实例代码的相关资料,需要的朋友可以参考下

LintCode 堆化详解及实例代码

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

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

样例

给出 [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]
如果有很多种堆化的结果?

返回其中任何一个。

分析:一开始想到堆化么肯定就是堆排序吧,粗粗一想貌似复杂度是O(nlgn),后来参考该文章才知道O(nlgn)是复杂度上限,平均是O(n)

代码:

class Solution { 
public: 
  /** 
   * @param A: Given an integer array 
   * @return: void 
   */ 
  void heapify(vector<int> &A) { 
    // write your code here 
    int n = A.size()-1; 
    for(int i=n/2;i>=0;i--) 
      heapify(A,i); 
  } 
  void heapify(vector<int> &A,int i) 
  { 
    int l = 2*i+1; 
    int r = 2*i+2; 
    int smallest = i; 
    if(l<A.size()&&A[l]<A[smallest]) 
      smallest = l; 
    if(r<A.size()&&A[r]<A[smallest]) 
      smallest = r; 
    if(smallest!=i) 
    { 
      swap(A[i],A[smallest]); 
      heapify(A,smallest); 
    } 
  } 
}; 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • C语言数据结构实现字符串分割的实例

    C语言数据结构实现字符串分割的实例

    这篇文章主要介绍了C语言数据结构实现字符串分割的实例的相关资料,希望通过本文能帮助到大家实现这样的功能,需要的朋友可以参考下
    2017-10-10
  • C语言WinSock学习笔记

    C语言WinSock学习笔记

    本篇文章主要介绍了C语言WinSock学习笔记,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2007-12-12
  • C语言实现纸牌24点小游戏

    C语言实现纸牌24点小游戏

    这篇文章主要为大家详细介绍了C语言实现纸牌24点小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • C++模拟实现string的详细过程

    C++模拟实现string的详细过程

    在 C++ 编程中,字符串的处理是一项常见且重要的任务,标准库中的 string 类为我们提供了便捷、高效的字符串操作方法,模拟实现 string 类 的背景源于对 C++ 底层原理的探索欲望,所以本文给大家介绍了C++模拟实现string的详细过程,需要的朋友可以参考下
    2024-08-08
  • C++11 线程同步接口std::condition_variable和std::future的简单使用示例详解

    C++11 线程同步接口std::condition_variable和std::future的简单使用示例详

    本文介绍了std::condition_variable和std::future在C++中的应用,用于线程间的同步和异步执行,通过示例代码,展示了如何使用std::condition_variable的wait和notify接口进行线程间同步
    2024-09-09
  • C语言实现文件读写操作的几种常用方法

    C语言实现文件读写操作的几种常用方法

    C语言提供了一系列文件操作函数,使得我们可以通过程序对文件进行读写操作,本文主要介绍了C语言实现文件读写操作的几种常用方法,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • 详解C++17中类模板参数推导的使用

    详解C++17中类模板参数推导的使用

    自C++17起就通过使用类模板参数推导,只要编译器能根据初始值推导出所有模板参数,那么就可以不指明参数,下面我们就来看看C++17中类模板参数推导的具体使用吧
    2024-03-03
  • opencv实现颜色检测

    opencv实现颜色检测

    这篇文章主要为大家详细介绍了opencv实现颜色检测,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • 详解C语言常用的一些转换工具函数

    详解C语言常用的一些转换工具函数

    这篇文章主要介绍了C语言常用的一些转换工具函数,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 深入解析C++ Data Member内存布局

    深入解析C++ Data Member内存布局

    本篇文章是对C++中的Data Member内存布局进行了详细的分析介绍,需要的朋友参考下
    2013-07-07

最新评论