大厂算法面试之leetcode精讲12.堆

大厂算法面试leetcode精讲1.开篇介绍 Linked List 就是特殊化的tree Tree就是特殊化的Graph 二叉搜索树:也称有序二叉树,指一棵空树或者具有一下性质的二叉树 左子树上所有节点的值均小于它的根节点的值 右子树上的所有节点的值均大于它根节点的值 递归左右子树也为二叉搜索树 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8iMoCQAz-1633990101419)(ds_36.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wl7kCnGj-1633 阅读详情

大厂算法面试之leetcode精讲12.堆

视频讲解(高效学习):点击学习
目录:

1.开篇介绍

2.时间空间复杂度

3.动态规划

4.贪心

5.二分查找

6.深度优先&广度优先

7.双指针

8.滑动窗口

9.位运算

10.递归&分治

11剪枝&回溯

12.堆

13.单调栈

14.排序算法

15.链表

16.set&map

17.栈

18.队列

19.数组

20.字符串

21.树

22.字典树

23.并查集

24.其他类型题

延伸:

满二叉树:除叶子节点外,所有的节点都有两个子节点,这类二叉树称作满二叉树(Full Binarry Tree),如下图:

完全二叉树:若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层从右向左连续缺若干结点,这就是完全二叉树。

ds_208

堆是一个完全二叉树,所以我们可以采用数组实现,不会浪费太多空间,堆中的每个节点的值总是不大于或不小于其父节点的值,堆分为大顶堆和小顶堆,大顶堆堆顶是元素中最大的一个,小顶堆堆顶是最小的,在向堆中加入元素的时候,能动态调整堆内元素的顺序,始终保持堆的性质。

堆的特点:
  • 内部数据是有序的
  • 可以弹出堆顶的元素,大顶堆就是弹出最大值,小顶堆就是弹出最小值
  • 每次加入新元素或者弹出堆顶元素后,调整堆使之重新有序仅需要O(logn)的时间
堆的实现
  • 用数组实现,堆从上到下,从左到右一一对应数组中的元素
  • 节点父节点索引 parentIndex = [(index - 1) / 2],左节点索引leftIndex = index * 2 + 1,右节点索引 rightIndex = index * 2 + 2
  • 第一个非叶子节点是[size / 2]
向堆中添加元素
  • 把新数据添加到树的最后一个元素,也就是数组的末尾
  • 把末尾节点向上调整,即bubbleUp
  • 时间复杂度O(logn)

动画过大,点击查看

弹出堆中的元素
  • 交换根节点与最后一个节点的值
  • 删除最后一个节点
  • 把根节点向下调整
  • 时间复杂度O(logn)

动画过大,点击查看

从一个数组中取出最小值的复杂度:

ds_115

完整代码
class Heap {
    constructor(comparator = (a, b) => a - b, data = []) {
        this.data = data;
        this.comparator = comparator;//比较器
        this.heapify();//堆化
    }

    heapify() {
        if (this.size() < 2) return;
        for (let i = Math.floor(this.size()/2)-1; i >= 0; i--) {
            this.bubbleDown(i);//bubbleDown操作
        }
    }

    peek() {
        if (this.size() === 0) return null;
        return this.data[0];//查看堆顶
    }

    offer(value) {
        this.data.push(value);//加入数组
        this.bubbleUp(this.size() - 1);//调整加入的元素在小顶堆中的位置
    }

    poll() {
        if (this.size() === 0) {
            return null;
        }
        const result = this.data[0];
        const last = this.data.pop();
        if (this.size() !== 0) {
            this.data[0] = last;//交换第一个元素和最后一个元素
            this.bubbleDown(0);//bubbleDown操作
        }
        return result;
    }

    bubbleUp(index) {
        while (index > 0) {
            const parentIndex = (index - 1) >> 1;//父节点的位置
            //如果当前元素比父节点的元素小,就交换当前节点和父节点的位置
            if (this.comparator(this.data[index], this.data[parentIndex]) < 0) {
                this.swap(index, parentIndex);//交换自己和父节点的位置
                index = parentIndex;//不断向上取父节点进行比较
            } else {
                break;//如果当前元素比父节点的元素大,不需要处理
            }
        }
    }

    bubbleDown(index) {
        const lastIndex = this.size() - 1;//最后一个节点的位置
        while (true) {
            const leftIndex = index * 2 + 1;//左节点的位置
            const rightIndex = index * 2 + 2;//右节点的位置
            let findIndex = index;//bubbleDown节点的位置
            //找出左右节点中value小的节点
            if (
                leftIndex <= lastIndex &&
                this.comparator(this.data[leftIndex], this.data[findIndex]) < 0
            ) {
                findIndex = leftIndex;
            }
            if (
                rightIndex <= lastIndex &&
                this.comparator(this.data[rightIndex], this.data[findIndex]) < 0
            ) {
                findIndex = rightIndex;
            }
            if (index !== findIndex) {
                this.swap(index, findIndex);//交换当前元素和左右节点中value小的
                index = findIndex;
            } else {
                break;
            }
        }
    }

    swap(index1, index2) {//交换堆中两个元素的位置
        [this.data[index1], this.data[index2]] = [this.data[index2], this.data[index1]];
    }

    size() {
        return this.data.length;
    }
}
大厂算法面试leetcode精讲3.动态规划 大厂算法面试leetcode精讲3.动态规划 视频教程(高效学习):点击学习 目录: 1.开篇介绍 2.时间空间复杂度 3.动态规划 4.贪心 5.二分查找 6.深度优先&广度优先 7.双指针 8.滑动窗口 9.位运算 10.递归&分治 11剪枝&回溯 12. 13.单调栈 14.排序算法 15.链表 16.set&map 17.栈 18.队列 19.数组 20.字符串 21.树 22.字典树 23.并查集 24.其他类型题 什么是动态规划 动态规划,英文:Dynamic 阅读详情

相关推荐

大厂面试云集的《520道LeetCode题Java版答案》

去字节、美团、BAT等大厂面试,刷LeetCode上的数据结构+算法题是必修课。许多读者说,刷题的时候经常会遇到困难,想要找一本答案题解做参考。 下面分享几个用Java语言实现的开源LeetCode题解,也要感谢这些优秀的开源作者们,分享真的会让这个世界变得很美好。 LeetCode题解答案pdf(基于Java实现) 这是一本基于Java语言实现的LeetCode题解,格式为PDF,可作为刷题的辅助和参考,方便阅读,也方便打印出来学习。 需要完整该PD

aa119101的博客 1267

Leetcode刷题笔记——

刷一题等于刷10题,别再盲目刷题啦

qq_42898642的博客 697

【路由交换】思科5506防火墙三区域互通

思科 5506 inside outside dmz 互通

baidu_22774701的博客 6174

leetcode学习笔记】排序、基数排序、排序算法总结

leetcode学习笔记】排序、基数排序、排序算法总结

weixin_42685184的博客 906

leetcode-

https://juejin.im/post/6844903876550737928 https://www.cnblogs.com/geyouneihan/p/9703629.html https://leetcode-cn.com/problems/top-k-frequent-elements/solution/python-dui-pai-xu-by-xxinjiee/

MaYingColdPlay的博客 684

看动画,拿 Offer:大厂算法面试真题全解析

精讲视频包括 6.5 小时的随选视频 36 篇图文配套讲解 20 道编码练习题 完整的永久访问权 随时随地在移动设备上观看 为什么要学这门视频专栏? 在互联网大厂研发岗位的求职中,算法面试是必不可少的环节。如果你想进入一家顶级互联网公司并成为一名出色的软件工程师,解决算法问题是你绕不过去的一道坎。 算法设计能力是区分普通程序员与优秀程序员的方式。很多学习算法或准备面试的同学,搞不清晦涩难懂的...

GitChat 1738

大厂算法面试leetcode精讲11剪枝&回溯

大厂算法面试leetcode精讲11剪枝&回溯 视频讲解(高效学习):点击学习 目录: 1.开篇介绍 2.时间空间复杂度 3.动态规划 4.贪心 5.二分查找 6.深度优先&广度优先 7.双指针 8.滑动窗口 9.位运算 10.递归&分治 11剪枝&回溯 12. 13.单调栈 14.排序算法 15.链表 16.set&map 17.栈 18.队列 19.数组 20.字符串 21.树 22.字典树 23.并查集 24.其他类型题 剪枝 排除那些不符合条件的分支。提高

bemystery的博客 432

大厂算法面试leetcode精讲4.贪心

大厂算法面试leetcode精讲4.贪心 视频教程(高效学习):点击学习 目录: 1.开篇介绍 2.时间空间复杂度 3.动态规划 4.贪心 5.二分查找 6.深度优先&广度优先 7.双指针 8.滑动窗口 9.位运算 10.递归&分治 11剪枝&回溯 12. 13.单调栈 14.排序算法 15.链表 16.set&map 17.栈 18.队列 19.数组 20.字符串 21.树 22.字典树 23.并查集 24.其他类型题 什么是贪心算法 贪心法,又称贪心算法,贪婪算法,在

bemystery的博客 421

大厂算法面试leetcode精讲14.排序算法

大厂算法面试leetcode精讲14.排序算法 视频讲解(高效学习):点击学习 目录: 1.开篇介绍 2.时间空间复杂度 3.动态规划 4.贪心 5.二分查找 6.深度优先&广度优先 7.双指针 8.滑动窗口 9.位运算 10.递归&分治 11剪枝&回溯 12. 13.单调栈 14.排序算法 15.链表 16.set&map 17.栈 18.队列 19.数组 20.字符串 21.树 22.字典树 23.并查集 24.其他类型题 常见排序算法复杂度 n^2除nlogn在不

bemystery的博客 379

大厂算法面试leetcode精讲18.队列

大厂算法面试leetcode精讲18.队列 视频讲解(高效学习):点击学习 目录: 1.开篇介绍 2.时间空间复杂度 3.动态规划 4.贪心 5.二分查找 6.深度优先&广度优先 7.双指针 8.滑动窗口 9.位运算 10.递归&分治 11剪枝&回溯 12. 13.单调栈 14.排序算法 15.链表 16.set&map 17.栈 18.队列 19.数组 20.字符串 21.树 22.字典树 23.并查集 24.其他类型题 队列的特点:先进先出(FIFO) 队列的时间复

bemystery的博客 794

大厂算法面试leetcode精讲8.滑动窗口

大厂算法面试leetcode精讲8.滑动窗口 视频教程(高效学习):点击学习 目录: 1.开篇介绍 2.时间空间复杂度 3.动态规划 4.贪心 5.二分查找 6.深度优先&广度优先 7.双指针 8.滑动窗口 9.位运算 10.递归&分治 11剪枝&回溯 12. 13.单调栈 14.排序算法 15.链表 16.set&map 17.栈 18.队列 19.数组 20.字符串 21.树 22.字典树 23.并查集 24.其他类型题 3. 无重复字符的最长子串 (medium)

bemystery的博客 262

大厂算法面试leetcode精讲9.位运算

大厂算法面试leetcode精讲9.位运算 视频教程(高效学习):点击学习 目录: 1.开篇介绍 2.时间空间复杂度 3.动态规划 4.贪心 5.二分查找 6.深度优先&广度优先 7.双指针 8.滑动窗口 9.位运算 10.递归&分治 11剪枝&回溯 12. 13.单调栈 14.排序算法 15.链表 16.set&map 17.栈 18.队列 19.数组 20.字符串 21.树 22.字典树 23.并查集 24.其他类型题 位运算基础: 程序中所有的数载计算机内存中都是以

bemystery的博客 370

大厂算法面试leetcode精讲24.其他类型题

大厂算法面试leetcode精讲24.其他类型题 视频讲解(高效学习):点击学习 目录: 1.开篇介绍 2.时间空间复杂度 3.动态规划 4.贪心 5.二分查找 6.深度优先&广度优先 7.双指针 8.滑动窗口 9.位运算 10.递归&分治 11剪枝&回溯 12. 13.单调栈 14.排序算法 15.链表 16.set&map 17.栈 18.队列 19.数组 20.字符串 21.树 22.字典树 23.并查集 24.其他类型题 65. 有效数字 (hard) 图是网络结

bemystery的博客 383

大厂算法面试leetcode精讲16.set&map

大厂算法面试leetcode精讲16.set&map 视频讲解(高效学习):点击学习 目录: 1.开篇介绍 2.时间空间复杂度 3.动态规划 4.贪心 5.二分查找 6.深度优先&广度优先 7.双指针 8.滑动窗口 9.位运算 10.递归&分治 11剪枝&回溯 12. 13.单调栈 14.排序算法 15.链表 16.set&map 17.栈 18.队列 19.数组 20.字符串 21.树 22.字典树 23.并查集 24.其他类型题 集合与字典 : 集合常见的形

bemystery的博客 561

大厂算法面试leetcode精讲17.

大厂算法面试leetcode精讲17.栈 视频讲解(高效学习):点击学习 目录: 1.开篇介绍 2.时间空间复杂度 3.动态规划 4.贪心 5.二分查找 6.深度优先&广度优先 7.双指针 8.滑动窗口 9.位运算 10.递归&分治 11剪枝&回溯 12. 13.单调栈 14.排序算法 15.链表 16.set&map 17.栈 18.队列 19.数组 20.字符串 21.树 22.字典树 23.并查集 24.其他类型题 Stack的特点:先进后出(FILO) 使

bemystery的博客 281

大厂算法面试leetcode精讲10.递归&分治

大厂算法面试leetcode精讲10.递归&分治 视频教程(高效学习):点击学习 目录: 1.开篇介绍 2.时间空间复杂度 3.动态规划 4.贪心 5.二分查找 6.深度优先&广度优先 7.双指针 8.滑动窗口 9.位运算 10.递归&分治 11剪枝&回溯 12. 13.单调栈 14.排序算法 15.链表 16.set&map 17.栈 18.队列 19.数组 20.字符串 21.树 22.字典树 23.并查集 24.其他类型题 递归三要素 递归函数以及参数 递

bemystery的博客 297

大厂算法面试leetcode精讲13.单调栈

大厂算法面试leetcode精讲13.单调栈 视频讲解(高效学习):点击学习 目录: 1.开篇介绍 2.时间空间复杂度 3.动态规划 4.贪心 5.二分查找 6.深度优先&广度优先 7.双指针 8.滑动窗口 9.位运算 10.递归&分治 11剪枝&回溯 12. 13.单调栈 14.排序算法 15.链表 16.set&map 17.栈 18.队列 19.数组 20.字符串 21.树 22.字典树 23.并查集 24.其他类型题 239. 滑动窗口最大值 (hard) 方法1

bemystery的博客 316

用 SAML 2.0 Bearer Assertion 配置 ABAP OAuth 2.0 令牌交换

摘要: SAP系统集成中,身份跨系统传递是关键挑战。OAuth 2.0的SAML 2.0 Bearer Assertion grant机制通过SAML断言换取访问令牌,实现安全身份传递。配置核心在ABAP的SOAUTH2事务码,需绑定可信SAML身份提供商(IdP)并指定访问范围。实际应用中,需确保SSL加密传输,正确配置SAML IdP信任关系,并为OAuth客户端分配专用系统用户。常见问题包括证书不匹配、权限配置不当等,需分层控制权限边界以保障安全。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 786

Unity 4.6 仿QQ斗地主demo

斗地主 叫地主 抢地主 出牌(电脑只出最小能管上的) 15天做的demo 参考了很多工程,杂糅了一下,提示功能没做 是否叫地主和抢地主要改代码,没做显示控制

上一篇: 大厂算法面试之leetcode精讲11剪枝&回溯
下一篇: 大厂算法面试之leetcode精讲13.单调栈
全栈潇晨
博客等级 码龄14年 29粉丝 · 63原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值