- 博客(84)
- 资源 (26)
- 问答 (1)
- 收藏
- 关注
原创 排序2:快速排序
快速排序(Quick Sort):是对冒泡排序的一种改进方法,在冒泡排序中,进行元素的比较和交换是在相邻元素之间进行的,元素每次交换只能移动一个位置,所以比较次数和移动次数较多,效率相对较低。而在快速排序中,元素的比较和交换是从两端向中间进行的,较大的元素一轮就能够交换到后面的位置,而较小的元素一轮就能交换到前面的位置,元素每次移动的距离较远,所以比较次数和移动次数较少,y速度较快,故称为“快速排序”。1.快速排序基本思想在待排序的元素任取一个元素作为基准(通常选第一个元素,但最的选择方法是从待排序
2021-07-31 17:07:37 197
原创 排序1:几种基本的排序方法
在数据结构课里,一般会将查找和排序放在一起,而且一般都会感觉查找比排序容易。但是我们研究过算法之后就会发现查找远远难于排序,因为常见的排序方法是相对固定的。而查找除了最基本的二分查找外,还包含非常广的内容,二叉树,各种树,Hash,大数据下的查找,而动态规划和回溯等本身也是在寻找某个特定的目标。所以查找散步在整个算法中,我们不单独列了。排序我们先看看都有哪些常见的算法。还有一些基于某些特征的典型算法题,之后我们就一边整理算法,一边见识一下这些变形题。常见的排序方法有:1冒泡排序。2.选择排序。3 插.
2021-07-31 16:53:17 2042 1
原创 半小时看懂红黑树——全网最易理解教程
相信很多人都知道红黑树,就是结点有红色和黑色两种。在Linux内存管理、java的Map里都大量使用了红黑树。那到底啥是红黑树,为什么会有红黑树呢?用AVL树不香吗?关于什么是红黑树,有一个很出名的段子。某猿去一大厂面试,面试官就问什么是红黑树,该猿没有答上来。最后面试接近尾声,面试官象征性问是否还有其他问题的时候,该猿就说,请问红黑树是啥呢?结果面试官说:我也不记得了。为啥会这样,因为在太多的材料里一提到红黑树就甩出5大条件,然后就是一堆的解释:(1)每个节点或者是黑色,或者是红色。(2)根
2021-07-31 15:27:10 763 1
原创 堆和优先级队列4:不泡妹子都要会的LeetCode7道题之二
本文介绍的两个题比前面的更重要。1.LeetCode215 数组中的第K大元素这个题其实有多种解法,先看使用优先级队列的。如果使用堆,记住一个口诀:找K大用小根堆找K小用大根堆。如果参考堆的特性,不难理解,读者可以想想为啥。public int findKthLargest(int[] nums, int k) { // 正确性判断 if (0 == nums.length || null == nums || k <= 0 || k &...
2021-07-29 23:57:55 116
原创 堆和优先级队列3:不泡妹子都要会的LeetCode7道题之一
我们前面费了那么大篇幅介绍堆和优先级队列,就是为了分析本文的7道题。而这7道题,特别!特别!特别!重要!重要!重要!不过呢,正如我们前面说的,这些题目其实知道怎么处理就行,不必一定要写出来。1.Leetcode23 合并K个排序链表这个题我们前面曾经花了很大的篇幅来介绍,其中提到一句说可以使用优先级队列来做。原理是不管几个链表,最终都是按照顺序来的。如果使用优先级队列,每次都将剩余节点的最小值加到输出链表尾部,最后堆空的时候,合并也就完成了。public ListNode me
2021-07-29 23:48:37 216 3
原创 堆和优先级队列2:java实现堆和优先级队列
1.什么是优先级队列在C++和java等库中,都提供了优先级队列这个容器,java中的优先级队列是PriorityQueue。其实底层就是一个堆的结构,只不过将堆封装了一层而已。其实名字叫个优先级队列,但总觉得和队列是不沾边的。不知道为啥这么叫。接下来我们看一下java实现堆和使用优先级队列的一些代码,这些面试一般不用写,我们感受一下其实现原理就好。PriorityQueue的实现直接参考jdk源码。我们这里用java自己实现一个。2.堆的建立过程给定一个初始化数组来建立一个最大堆,假.
2021-07-29 23:07:07 138 1
原创 堆和优先级队列1:堆概念和构造过程
堆是java核心基础中的重要内容,同时也是算法中的重要内容,幸运的是堆相关的算法一般说清楚解决方法就行了,不需要手写。原因是如果自己构造堆,一小时也写不完,如果调用java自带的,很多时候我们也不记得该怎么用,因此面试官一般不会难为人。1、堆的概念堆的概念堆是将一组数据按照完全二叉树的存储顺序,将数据存储在一个一维数组中的结构。堆有两种结构,一种称为大顶堆,一种称为小顶堆,如下图。小顶堆:任意结点的值均小于等于它的左右孩子,并且最小的值位于堆顶,即根节点处。大顶堆:任意结点的值均大于等于它
2021-07-29 22:46:22 167
原创 其他类型的树1:平衡二叉树和AVL树
平衡二叉树和AVL树,我们主要理解其特点就行了,不需要能写代码。AVL树用的也不多,热度也不如堆、B+树、红黑树这些,但是掌握平衡树有助于我们理解其他的树。有个地址很好的演示了AVL树的结构特征http://en.wikipedia.org/wiki/Self-balancing_binary_search_tree1.平衡二叉树的概念和意义平衡二叉树(Balanced Binary Tree或Height-Balanced Tree)又称AVL树。它或者是一颗空树,或者是具有下列性质的
2021-07-29 22:02:16 209
原创 二叉树23:二叉搜索树的几道题
1.LeetCode98:验证二叉树给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。例如输入:输入: 5 / \ 1 4 / \ 3 6输出: false解释: 输入为: [5,1,4,null,null,3,6]。 根节点的值为 5 ,但是其右子节点值为 4 中序遍历轻...
2021-07-27 23:54:37 221
原创 二叉树22:二叉搜索树之一
前面我们挥挥洒洒20多篇一直在分析二叉树,你是否发现我们用的方法有层次遍历,前序遍历,后序遍历,为啥没有中序遍历呢?难道中序不重要?恰恰相反,中序太重要了,我们要单独分专题讨论。1.从二分查找说起我们在递归迭代和分治部分分析过二分查找。二分法的查找过程是,在一个有序的序列中,每次都会选择有效范围中间位置的元素作判断,即每次判断后,都可以排除近一半的元素,直到查找到目标元素或返回不存在,所以n个有序元素构成的序列,查找的时间复杂度为O(logn)。而将二分查找的过程画成一棵树,恰恰就是一个搜索树。
2021-07-27 23:23:47 560
原创 递归、迭代和分治(7):二分查找的5个变形题
二分查找很经典,但是面试的时候不一定直接考察这个问题,而是考察其变形题,我们一起看一下。1.元素中有重复的二分查找假如在上面的基础上,元素存在重复,该怎么做呢?这个是我面快手时真实遇到的的。如果刷了二分查找,我们就能分析出来,这里的关键是找到目标结果之后不是返回而是继续向左侧移动。1.1循环的两种方式查找到之后继续向左逼近: public int search(int[] nums, int target) { //边界条件判断 if (nums == n.
2021-07-27 22:49:59 125
原创 递归、迭代和分治(6):分治与二分查找
1.分治的基本思想在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如二分搜索、排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。问题的规模越小,越容易直接求解,解题所需的计算时间也越少。例如,对于n个元素的排序问题,当n=1
2021-07-27 22:49:40 304
原创 递归、迭代和分治(5):迭代器模式
在23中设计模式中有一个迭代器模式,我们可能关注的并不多,但是笔者曾经两次遇到过与之相关的任务。1.我的经历一次是在一个短视频的任务中遇到这样的场景:需要对视频片进行转码优化,主要意思是对视频片进行多次转码,每次都看码率是否满足要求,如果满足就退出,如果不满足就根据上一轮的转码参数对视频再一次转码。三次之后还不满足,就使用恒定码率将视频强行转到目标码率之下。画图就是这样子:这么看过程不算特别复杂是不,但是每一步都是一个完整的视频转码过程,涉及的参数特别多,执行转码的调用链路也特别长,而且前
2021-07-27 22:49:05 138
原创 二叉树21:阶段总结:怎么用递归解决二叉树问题
我们前面介绍了十几个算法题,里面有很多共性问题,我们可以统一梳理一下,我现在能想到,并且找到一些参考借鉴的有两个,对称性递归和路径相关问题。其他我们后面继续补充。参考地址:https://leetcode-cn.com/problems/merge-two-binary-trees/solution/yi-pian-wen-zhang-dai-ni-chi-tou-dui-che-asg8/不过呢,原文代码是用C++写的,我们这里转成java的。1.什么是对称性递归力扣上很多树的题目都是可
2021-07-27 09:36:20 326
原创 二叉树20:合并两个二叉树
LeetCode617:给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新 值,否则不为 NULL 的节点将直接作为新二叉树的节点。注意: 合并必须从两个树的根节点开始。示例:分析:这个题看似复杂,很多同学疑惑的点是如何同时遍历两个二叉树呢? 其实和遍历一个树逻辑是一样的,只不过传入两个树的节点,同时操作。二叉树使用递归,就要想使用前中后哪种遍历方式
2021-07-27 09:06:48 1285 1
原创 二叉树19:构造二叉树两道题
今天我们要解决两道构造二叉树的题;106.从中序与后序遍历序列构造二叉树105.从前序与中序遍历序列构造二叉树先记住一个结论:根据前序和中序可以唯一构造一棵二叉树,根据中中序和后序也能唯一构造一个棵二叉树,但是前序和后序不行。下面分析1.leetcode106.从中序与后序遍历序列构造二叉树根据一棵树的中序遍历与后序遍历构造二叉树。你可以假设树中没有????复的元素。例如,给出中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9,15,7
2021-07-27 07:59:51 485
原创 二叉树18:路径总和两道题
接下来我通过详细讲解如下两道题,来看看函数返回值的设置问题。其实这个问题也可以归类到nSum问题。但是与二叉树结构更为密切,我们在这里分析更合适。112. 路径总和113. 路径总和II1.LeetCode 112 路径总和题意:给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目 标和。说明: 叶子节点是指没有子节点的节点。给定如下二叉树,以及目标和 sum = 22,返回 true, 因为存在目标和为 22 的根节点到叶子节点.
2021-07-27 07:59:45 130
原创 二叉树17:找树左下⻆的值
LeetCode513:给定一个二叉树,在树的最后一行找到最左边的值。输出结果为7题使用层序遍历再合适不过了,比递归要好理解的多! 只需要记录最后一行第一个节点的数值就可以了。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * ..
2021-07-27 07:59:40 96
原创 二叉树16:左叶子之和
LeetCode404:计算给定二叉树的所有左叶子之和。首先要注意是判断左叶子,不是二叉树左侧节点,所以不要上来想着层序遍历。因为题目中其实没有说清楚左叶子究竟是什么节点,那么我来给出左叶子的明确定义:如果左节点不为空,且左节 点没有左右孩子,那么这个节点就是左叶子大家思考一下如下图中二叉树,左叶子之和究竟是多少?其实是0,因为这棵树根本没有左叶子! 那么判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子。如果该节点的左节点不为空,该节点.
2021-07-27 07:59:08 723
原创 二叉树15:二叉树的最近公共祖先
LeetCode 372 ,给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 例如,给定如下二叉树:输入:root = [3,5,1,6,2,0,8,null,null,7,4] p = 5, q = 1输出:3解释:节点 5 和节点 1 的最近公共祖先是节点 3。要想找到两个节点的最近公共祖先节点,我们可以从两个节点往上找,每个节点都往上 走,一直走到根节点,那么根节点到这两个节点的连线肯定有相交的地方,如果是从上 往下走,那么最后一次相交的节点就是他们的最近公共祖先节点。我
2021-07-27 07:58:55 107
原创 二叉树14:相同的树
LeetCode485:给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。例如:1.递归解法这个貌似就是就是两个二叉树同时进行前序遍历,先判断根节点是否相同, 如果相同再分别判断左右子节点是否相同,判断的过程中只要有一个不相同就返回 false,如果全部相同才会返回true。其实就是这么回事。看代码:public boolean isSameTree(TreeNode p, TreeNode q) {//如果都.
2021-07-27 07:58:45 123
原创 二叉树13:二叉树的所有路径
LeetCode257:给定一个二叉树,返回所有从根节点到叶子节点的路径。1.深度优先的递归写法深度优先搜索就是从根节点开始,一直往左子节点走,直到左子节点为空,让后返回到上一步从右子节点在执行同样的操作,就像下面图中这样:二叉树的深度优先搜索代码如下: public static void treeDFS(TreeNode root) { //当前节点为空直接返回 if (root == null) return;..
2021-07-26 00:10:01 429
原创 二叉树12:判断平衡二叉树
LeetCode110给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。首先我们注意到这里提到的是高度,前面我们还提到过深度的问题,两者啥区别呢?二叉树节点的深度:指从根节点到该节点的最⻓简单路径边的条数。 二叉树节点的高度:指从该节点到叶子节点的最⻓简单路径边的条数。有点绕是吗?废话不多少,直接看图,能懂就行:关于根节点的深度究竟是1 还是 0,不同的地方有不一样的标准,leetcode的题...
2021-07-26 00:09:51 148
原创 二叉树11:完全二叉树的节点个数
Leetcode222.完全二叉树的节点个数要求是 给出一个完全二叉树,求出该树的节点个数。完全二叉树的节点数其实是可以在找到最后一层最右侧的元素之后直接使用公式计算的。这里我们需要先明确什么是完全二叉树,以及普通二叉树和完全二叉树的区别。我们先不考虑完全二叉树,而是按照普通二叉树的思路来全部遍历并统计。这道题目的递归法和求二叉树的深度写法类似, 而迭代法,用层序遍历稍稍修改一下,记录遍历的节点数就可以了。递归遍历的顺序依然是后序(左右中)。1.普通递归求解还是三部曲:1..
2021-07-26 00:09:38 2220
原创 二叉树10:二叉树的最小深度
给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数。说明: 叶子节点是指没有子节点的节点。例如该树的最小深度是2.直觉上好像和求最大深度差不多,其实还是差不少的。遍历顺序上依然是后序遍历(因为要比较递归返回之后的结果),但在处理中间节点的逻辑上,最大深度很容易理 解,最小深度可有一个误区,如图:这种情况该怎么处理呢?这就要新审题了,题目中说的是:最小深度是从根节点到最近叶子节点的最短路径上的节点数量。,注意是叶子节 点。什么是叶子节点,左..
2021-07-26 00:09:25 367
原创 二叉树9:二叉树的最大深度
本文主要分析两道题,LeetCode 104 如何找二叉树的最大深度和LeetCode559:N叉树的最大深度。1.LeetCode104 二叉树的最大深度我们还是先看一下题意LeetCode104:给定一颗二叉树,找出其最大深度。二叉树的最大深度是根节点到最远叶子节点的最长路径上的节点数。例如下面这棵树的最大深度为31.1 递归法本题其实也要后序遍历(左右中),依然是因为要通过递归函数的返回值做计算树的高度。 按照递归三部曲,来看看如何来写。1. 确定递归函数的参数和.
2021-07-26 00:09:14 152
原创 二叉树8:对称二叉树
这个题曾经是我一个同事远程面试实习生时问过,当时那位同学写了整整40min,搞了70多行,最后我同事问,你能自己解释清楚是怎么回事吗?我不知道对方写的是什么,但是一定不知道怎么正确的分析这个题,我们就来看一下。LeetCode101 给定一个二叉树,检查它是否是镜像对称的。例如下面这个就是对称二叉树:其实这个图示不好,往往会感觉每个子树都是各自对称的。我们先看镜像对称的样子:所以如果树是镜像的,下面这个图更直观一些:镜像是两侧按照根节点所在的中轴线为基准对称的,不一定每个...
2021-07-26 00:08:51 258
原创 二叉树7:LeetCode226:翻转二叉树
z将二叉树整体反转,如下图所示:你在纠结这个题该怎么做对不?我告诉你有2*2+1,至少5种方式来处理。首先这里是所有非空节点都交换其两个孩子节点,所以我们可以使用前序或者后续来进行,而前序和后续都有递归和迭代两种方式,这就4种方法。另外,我们还可以每次获得一层,然后将该层整体翻转再处理下一层。所以至少有5种处理方式。1.递归翻转的两种方法这是一道很经典的二叉树问题。显然,我们从根节点开始,递归地对树进行遍历,并从叶子节点先开始翻转。如果当前遍历到的节点 root 的左右两棵子树.
2021-07-26 00:08:24 102
原创 二叉树6:迭代法实现二叉树的遍历
我们在《递归迭代和分治》专题就介绍过,递归能做的迭代一定能做,但是可能会比较复杂。但是与递归相比,代码会稍微好理解一些,所以万一面试时实在想不清楚怎么用递归,那就用迭代+栈硬写,所以这种方法我们也是需要会的。递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中,然后递归返回的时候,从栈顶弹出上一次递归的各项参数,所以这就是递归为什么可以返回上一层位置的原因。此时大家应该知道我们用栈也可以是实现二叉树的前后中序遍历了。我们就用迭代法再次练习三道题:144.二叉树的前序遍
2021-07-26 00:08:16 216
原创 二叉树5.深度优先遍历的递归思想
深度优先遍历有前中后三种情况,估计大部分人都能背下来,但是其中的道理是什么呢?为啥遇到自己处理边型题就搞不定了呢,为什么很多同学看递归算法都是“一看就会,一写就废”。 主要是对递归不成体系,没有方法论,每次写递归算法 ,都是靠玄学来写代码,代码能不能编过都靠气。1.前中后序遍历的递归实现这次我们要好好谈一谈递归,本篇将介绍前后中序的递归写法,一些同学可能会感觉很简单,其实不然,我们要通过简单题目把方法论确定下来,有了方法论,后面才能应付复杂的递归。接下来我们要处理大量的前中后遍历的题目,都是基于
2021-07-26 00:08:07 319 1
原创 二叉树4. 层次遍历之三:下一个右侧节点指针
现在我们来看两个递进的题目:116. 填充每个节点的下一个右侧节点指针117.填充每个节点的下一个右侧节点指针I1.LeetCode 116填充满二叉树的下一个右侧节点指针给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。示例:方法1:迭代解法回想一下二叉树的层次遍历,.
2021-07-26 00:06:20 132
原创 二叉树3. 层次遍历之二:3道变形题目
我们继续看几个典型的层次遍历的题目515.在每个树行中找最大值637.二叉树的层平均值199.二叉树的右视图这三道题,515和637的思路基本一致,就是先要确定每层的元素,之后再求最大、最小、平均,都不在话下。1.LeetCode 515. 在每个树行中找最大值给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。这里其实就是在得到一层之后使用一个变量来记录当前得到的最大值:class Solution { public List<I..
2021-07-26 00:06:11 348 3
原创 二叉树2. 层次遍历之一
树的遍历有两张基本的方式,广度优先和深度优先两种基本的方式。广度优先相对简单,题目也比较少,整个LeetCode也就10来道题目。而深度优先的类型多、变换多,难度差异也很大,所以我们先将层次遍历的9道题吃掉。之后专心对付深度优先。广度优先又叫层次遍历,层次遍历其基本过程如下所示:层次遍历就是从根结点开始,先访问根节点下面一层全部元素,再访问之后的层次,类似金字塔一样一层层访问。上面的图示按照层次访问的结果就是:[1,2,3,4,5,6,7]。我们可以看到这里就是从左到右一层一层的去遍
2021-07-26 00:06:01 204
原创 二叉树1. 二叉树的基本概念
树是算法体系中一个极为庞大的体系,常见题目数量甚至比前面一个专题的还多。为此,我们不得不将其分为二叉树和其他树两个大模块来分析。二叉树模块自然是分析二叉树的构造、特征、遍历、线索化和各类变来变去的问题。其他树则是平衡树与AVL树、红黑树、堆与优先级队列、决策树、B树与B+树等问题。对于二叉树,我们继续分成若干小专题来分析,有些小专题可能需要两三篇来分析。对于常见的题目我们一个个分析。二叉树的内容整理完预计至少30篇,也就是差不多一个月的时间吧。今天我们先来整理树和二叉树相关的重要理论基础。1
2021-07-26 00:05:48 644 5
原创 递归、迭代和分治(4):迭代器原理
讨论完了递归,我们再来感受一下迭代器。1.背景迭代器是否感觉陌生又熟悉?熟悉是因为在访问ArrayList、LinkedList、HashSet等元素时,都有一种方式叫迭代器。陌生是用循环来访问元素不香吗?为啥会有迭代器?另外就是迭代器是怎么工作的呢?迭代器模式又是什么鬼?接下来我们就用几期来分析java中的迭代器相关的问题。这些问题在算法面试时考得并不多,但是可以加深我们对jdk集合的理解。面试时,如何证明对jdk的集合有深入的了解呢?笔者觉得比较重要的有Hash和Set家族、链表和Array
2021-07-26 00:05:13 166
原创 递归、迭代和分治(3):递归的优化
1.如何优雅地说一万次“我爱你”咕泡曾经举行过一次线上小活动,看谁说更多的“我爱咕泡”,我当时写了这么一段代码:publicclassFibonacciTest{publicstaticintcount=0; public static void main(String[] args) { Fibonacci(20); System.out.println("count:" + count);} public static i...
2021-07-26 00:05:04 146
原创 递归、迭代和分治(2):递归的典型例子
本期我们一起看几个典型的递归的例子。递归就是每次调用的时候方法是自己,但是参数变了,就是下面这个样子:1.斐波那契数列斐波那契数列的是这样一个数列:1、1、2、3、5、8、13、21、34….,即第一项 f(1) = 1,第二项 f(2) = 1…..,第 n 项目为 f(n) = f(n-1) + f(n-2)。求第 n 项的值是多少。我们来看看递归该怎么写。1、确定递归函数功能假设 f(n) 的功能是求第 n 项的值,代码如下:int f(int n){}2
2021-07-26 00:04:56 1307
原创 递归、迭代和分治(1):递归
1.从现实中理解三个概念可能很多人就已经接触了递归了,不过我敢保证很多人初学者刚开始接触递归的时候,是一脸懵逼的,我当初也是!可能也有一大部分人知道递归,也能看的懂递归,但在实际做题过程中,却不知道怎么使用,有时候还容易被递归给搞晕。下面谈谈我的一些经验,希望能够给你带来一些帮助。为了兼顾初学者,我会从最简单的题讲起!1.1递归我们应该都知道递归的概念,它的本质仍然是方法调用,不过是自己调用自己。这种例子在现实中也有很多的。例如有一个笑话:从前啊,有座山,山上有座庙,庙里有个老和
2021-07-26 00:04:46 674
原创 队列5:LRU的设计
这个题也经常见到,在牛客也是长期排名前三:不过,我没有遇到过,既然经常出现,那就一起来分析一下吧。LeetCode146:设计一个LRU缓存,先看题意:运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。实现 LRUCache 类:LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void pu.
2021-07-26 00:04:37 101
原创 队列4:栈实现队列和队列实现栈
栈的特点是后进先出,队的特点是先进先出。两个栈将底部拼接到一起就能实现队列的效果, 通过队列也能实现栈的功能。在很多地方能看到让你通过两个栈实现队列的题目,也有很多地方是两个队列实现栈的题目,我们就干脆一次看一下如何做。这正好对应LeetCode232和225两道题1.LeetCode232. 用栈实现队列先看题意:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x
2021-07-26 00:04:13 102
mysql-connector-c++-8.0.23-macos10.15-x86-64bit.dmg
2021-05-10
live555.chm帮助文档
2016-09-09
QtFtp源代码
2016-07-19
qt5使用curl实现文件下载的示例程序
2016-06-20
64位win7系统下安装USB下载器驱动FriendlyArm-usb-dnw-driver
2016-02-02
ffmpeg-2.0.tar.bz2 linux源代码
2014-05-02
vlc -1.1.7.tar.bz2 linux版源代码
2014-05-02
深度学习基础教程
2014-04-10
Geoffrey Hinton 深度学习 培训材料
2014-04-10
Handbook of Face Recognition 李子青-人脸识别技术
2014-04-10
为什么java中使用移位会出错
2022-01-15
TA创建的收藏夹 TA关注的收藏夹
TA关注的人