自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 收藏
  • 关注

原创 sync.Map理解

【代码】sync.Map理解。

2023-08-27 22:24:34 68

原创 使用pprof分析go web程序

启动web程序后,使用curl工具收集一定时间内的数据(假设是20秒)在此期间,就可以发送请求,最后,对收集到的数据进行分析。然后,在main中加入。

2023-07-09 16:54:38 82

原创 概率-10.1 概率问题(一)

这种解法可以推广到n个数的情况,我们知道,取n个随机数发生器,存在n个概率相同的独立事件,我们只使用这n个事件就得到1/n的概率了。答:由于生男生女概率都为1/2,所以有1/2的家庭第一胎就是男孩,有1/4的家庭第一胎是女孩,第二胎是男孩,有1/8的家庭前两胎都是女孩,第三胎是男孩。给定一个等概率随机产生1~5的随机函数,除此之外,不能使用任何额外的随机机制,请实现等概率随机产生1~7的随机函数。有2k只球队,有k-1个强队,其余都是弱队,随机把它们分成k组比赛,每组两个队,问两强相遇的概率是多大?

2023-05-07 12:03:14 128

原创 排列组合-9.6 卡特兰数问题

先以几个例子来说明卡特兰数问题。

2023-05-02 11:32:34 740

原创 排列组合-9.1 排列组合系列问题

ABCDEFG七人站队,要求A必须在B的左边,但不要求一定相邻,请问共有多少种排法?= 240种排法,同理,假设甲和丙相邻,同样有240种排法。首先,假设甲在最左侧,则它的右边不能是乙或丙,因此只能从剩下的3个中选一个,其他人任意组合,该种情况下共有。在6x9的方格中,以左上角为起点,右下角为终点,每次只能向下走或者向右走,请问一共有多少种不同的走法?其中,必有一半情况A在B的左边,另一半情况A在B的右边。有10颗糖,如果每天至少吃一颗,吃完为止,问有多少种不同的吃法?答:对于问题1,7人站队,有。

2023-04-29 17:17:41 262

原创 位运算-8.5/8.6 寻找奇数出现次数

须知在计算机中负数以补码形式存在, 而补码其实等于原码各位取反加一,因此一个数的补码,假设第k位是最低位的1,则比k低的位都是0,比k高的都与原码相反。因为0^1 = 1, 0^0 = 0,0与任何数异或得到原来的数,此处用0作为返回值的初始值。如果把所有该位等于1的数异或起来,因为其他所有数都出现了偶数次,必然能得到3,从而也能从3^5中得到5。给定一个整型数组arr,其中有两个数出现了奇数次,其他的数都出现了偶数次,找到这两个数。输入:[1,2,4,4,2,1,3,5], 8。,请返回题目所求数字。

2023-04-28 17:01:29 53

原创 位运算-8.4 比较

不能用比较运算符,那么就相减之后看正负。如果a-b为正,那么a>b;需要注意的是如果a,b符号不同,相减可能溢出,所以需要提前对符号进行判断。对于两个32位整数a和b,请设计一个算法返回a和b中较大的。但是不能用任何比较判断。若两数相同,返回任意一个。给定两个整数a和b,请返回较大的数。

2023-04-28 15:55:52 31

原创 位运算 8.3-交换

其中包含两个值,请不用任何额外变量交换这两个值,并将交换后的数组返回。请编写一个算法,不用任何额外变量交换两个整数的值。

2023-04-28 15:43:01 29

原创 二叉树-7.14 最大二叉搜索树

左子树中最大二叉搜索树的头结点;1. 左右子树中,最大二叉搜索树头结点分别是当前结点的左右孩子,且左子树中最大值小于当前结点值,当前结点值小于右子树中的最小值。2. 反之,以当前结点为根的子树不是二叉搜索树。此时,根据题意,返回结点数最多的一边,以及更新后的最大、最小值。有一棵二叉树,其中所有节点的值都不一样,找到含有节点最多 的搜索二叉子树,并返回这棵子树的头节点.,请返回所求的头结点,若出现多个节点最多的子树,返回头结点权值最大的。输入:{4,2,6,1,5,3,#,#,#,#,#,#,#}

2023-04-27 22:30:00 57

原创 二叉树-7.13 树上最远距离

由此可知,我们可以以先左后右的顺序递归地遍历一棵树,并返回:该子树中离子树根节点最远节点的距离,以及该子树中的最远距离。子树中的最远距离又可以在它的子树中的最大距离和左子树中到根结点最远的结点的距离加上右子树中到根结点最远的结点的距离再加上根节点中取最大值。情况2——最远距离是左子树中到根结点最远的结点的距离加上右子树中到根结点最远的结点的距离再加上根节点(注意距离指的是结点数目)。从二叉树的节点A出发,可以向上或者向下走,但沿途的节点只能经过一次,当到达节点B时,路径上的。给定一个二叉树的头结点。

2023-04-25 11:22:53 81

原创 二叉树-7.12 寻找错误结点

如果这样的结点存在两对,如(5,3), (4,2),说明它们是不相邻的,输出第二对的第二个值和第一对的第一个值;一棵二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这棵二叉树不再是搜索二叉树,请找到这两个错误节点并返回他们的值。其实看测试用例就可以看出来了,两个错误结点在中序遍历输出中相邻或者不相邻,如:中序遍历为 1 2 3 4 5。给定一棵树的根结点,请返回两个调换了位置的值,其中小的值在前。输入:{3,1,4,null,5,null,2}输入:{4,1,3,null,2,null,5}

2023-04-23 11:28:47 104

原创 二叉树-7.11 折纸

请把纸条竖着放在桌⼦上,然后从纸条的下边向上⽅对折,压出折痕后再展 开。此时有1条折痕,突起的⽅向指向纸条的背⾯,这条折痕叫做“下”折痕;突起的⽅向指向纸条正⾯的折痕叫做“上”折痕。如果每次都从下边向上⽅ 对折,对折N次。请从上到下计算出所有折痕的⽅向。上”,可以发现,每一次折痕,都是在上一次折痕左边加一条下折痕,右边加一条上折痕(这里用红色加粗的字来代表上一次的折痕)。,请返回从上到下的折痕的数组,若为下折痕则对应元素为"down",若为上折痕则为"up".折一次是下折痕,两次是“下。

2023-04-22 11:50:07 31

原创 二叉树-7.1(补) 寻找二叉树中序后继结点

所以,我们需要的是维护中序遍历中上一个访问的结点,以及当前结点,如果上一个访问的结点是p,那么就输出当前节点。如果p没有右孩子:对于任意一个结点n,如果它的值比p值大,说明p在n左边,应该到n的左子树中去找,由于p可能是n的左子树中的最右结点,p可能就是n的中序后继,所以需要记录一下n;如果n的值比p小,应该到n的右边去寻找,此时n绝不可能是p的中序后继。第二种解法利用了二叉搜索树的特点:因为二叉搜索树的中序序列是有序的(该题中为升序),如果一个结点有中序后继,那么它在中序序列中一定不是最大的。

2023-04-19 19:51:06 72

原创 二叉树 7.8-二叉平衡树判断

平衡二叉树要求左右子树高度最大相差为1。那么就有三种可能:1. 左子树或右子树不是平衡二叉树;2. 左右子树都是平衡二叉树,但高度相差大于1;3. 左右子树都是平衡二叉树且高度相差小于等于1。因此不仅需要知道左右子树是否是平衡二叉树,还需要知道他们的高度。我们可以用一个int值来判断:如果子树不是平衡二叉树,则返回-1,否则返回子树高度(或深度)。有一棵二叉树,请设计一个算法判断这棵二叉树是否为平衡二叉树。,请返回一个bool值,代表这棵树是否为平衡二叉树。

2023-04-19 11:30:49 31

原创 二叉树-7.9 完全二叉树判断

完全二叉树,其空缺的结点必然集中在右侧。因此如果一个结点有左孩子却没有右结孩子,则必然不是完全二叉树;如果完全二叉树中一个结点没有右孩子,那么它右侧的结点一定全是叶子结点(没有左右孩子) ,否则也不是完全二叉树。可以用层次遍历的方法,当出队的结点右孩子为空时,在之后出队的结点一定叶子节点。,请返回一个bool值代表它是否为完全二叉树。树的结点个数小于等于500。有一棵二叉树,请设计一个算法判断它是否是完全二叉树。输入:{1,2,3,null,4}输入:{1,2,3,4}

2023-04-18 10:39:48 39

原创 二叉树-7.4(补) 搜索树判断

视频教程中只提到了该类型的题目,却没有给出相关例题,此处用leetcode题目代替。

2023-04-17 11:29:48 34

原创 二叉树-7.6 二叉树序列化

对于非空结点,因为它的值的大小、正负是不确定的,我们用一个标志 "!对于测试用例中的例子,如果我们使用这样的编码方式,并用前序遍历的方法遍历这棵树,可以得到字符串:1!这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。著作权归领扣网络所有。

2023-04-16 12:24:05 42

原创 二叉树-7.5 二叉树的打印

我们可以在层次遍历的过程中用两个结点标记某一层的最右结点和下一层的最右结点,分别命名为last和nlast。当队头结点出队时,如果它是最右结点,说明该层已经打印完了,队列中剩余的应该是下一层的结点。至于nlast的更新,我们只需要每入队一个结点,就把nlast更新为该结点即可,因为上一层的结点出队时,一定会把左右孩子入队,当上一层的最右结点出队时,nlast一定是下一层的最右结点。,请返回打印结果,结果按照每一层一个数组进行储存,所有数组的顺序按照层数从上往下,且每一层的数组内元素按照从左往右排列。

2023-04-16 11:37:17 182

原创 二叉树-7.1 二叉树序列打印

在前序遍历中,我们每遍历到一个结点,当即把它打印出来,然后把它的左孩子压入栈中,遇到空结点时,把退栈得到栈顶元素x,然后x的右子树按上面做法继续压入栈中。观察递归做法中的前序遍历,可以发现:我们每遍历一个结点,当即打印出该结点,然后以左孩子,右孩子的顺序接着往下递归。一种通用的迭代解法。按照这个顺序,1入栈,2入栈,2出栈并打印,3入栈,3出栈并打印,轮到1时,因为它还有右子树,所以要把3再次入栈,这样就会重复打印3了,所以要使用一个栈打印结点值,除了记录当前正在遍历的结点,还要记录之前已经访问过的结点。

2023-04-14 22:28:12 701

原创 二分搜索-6.8 快速N次方

然后可以发现,我们可以这样想,第一个位置的1,让返回值乘以2,k更新为k*k = 2*2 = 4,第二个位置是0,k更新为k*k = 4*4 = 16,第三个位置的1,让返回值更新为2*16。如果两个整数相乘并得到结果的时间复杂度为O(1),得到整数k的N次方的过程请实现时间复杂度为O(logN)的方法。每当n%2 == 1,说明该位置上有一个“1”,然后再将n右移一位,判断下一位。,右移一位后发现第1位是0,不做操作。,请返回k的n次方,为了防止溢出,请返回结果Mod 1000000007的值。

2023-04-12 11:33:13 38

原创 二分查找-6.7 完全二叉树计数

所以,假设根节点的右子树上最左边的结点不为空,说明根节点的左子树是一颗满二叉树;而如果根节点的右子树上最左边的结点为空,说明根结点的右子树也是一颗满二叉树,只是高度比左子树低一层。假设我们知道了一棵子树是满二叉树,以及它的高度,那么这颗子树的结点数计算起来就很容易。给定一棵完全二叉树的根节点root,返回这棵树的节点个数。如果完全二叉树的节点数为N,请实现时间复杂度低于O(N)的解法。所以,对于一颗高度为h的完全二叉树,假如右子树高度为h-1,那么左子树+根节点的数目 = 1 + 2 +

2023-04-10 16:14:30 51

原创 二分查找-6.6 最左原位

排除掉以上的特殊情形后,假设我们查找的区间是[0 : n),那么对于一个中间值arr[mid],如果arr[mid] < mid,那么arr[mid-1] < arr[mid] < mid, ∴ arr[mid-1] < mid-1,以此类推,所有在mid左边的元素都不可能是我们要找的答案,left = mid+1。对于arr[mid] == mid的情形,mid可能是最终答案,但是由于我们要找的是。基于这一点,当arr[0] > 0的时候,由于arr[1] > a[0] > 0,∴arr[1] > 1。

2023-04-09 11:30:06 34

原创 二分查找-6.4 循环有序数组的最小值

可以想象这种极端情况,即nums[0:n-1]的值都比nums[n-1]大,那么在循环中,left一直会+1,直到left = n-2,right = n-1,此时取中值仍然取到mid = n-2,nums[mid]<nums[n-1],left继续+1,然后left == right == n-1,跳出循环,取到最小值。对于数组中无重复值的情况,整个数组的数值要么是升序的,要么分为前后两个部分,每一部分都是升序,但是前一部分的最小值一定比最后一个部分的最大值大(见下面a,b两图)。

2023-04-08 17:19:38 212

原创 二分查找-6.3 元素出现的最左边位置

arr[i] > num,最终目的是找到一个数。就这题来说,我们希望找到找到有序数组中num出现的第一个位置,那么当arr[mid] >= num 时, mid和mid右边的元素都大于或等于num,应该从mid左边的元素中取寻找;如果arr[mid] < num,那么所有小于等于mid的元素一定不是num,应该从mid右边元素中寻找。对于一个有序数组arr,再给定一个整数num,请在arr中找到num这个数出现的最左边的位置。,当left == right时,查找区间长度为0,此时跳出循环。

2023-04-05 12:50:07 154

原创 二分查找-6.2 局部最小值

如果都没有找到,那么可以用二分查找的方法:首先,我们找到中间位置mid,假设arr[mid] < arr[mid-1] && arr[mid] < arr[mid+1],那么mid位置的元素就是一个局部最小值;定义局部最小的概念。arr的长度为N(N>1)时,如果arr[0]

2023-04-04 16:02:35 113

原创 链表-5.13-5.15 判断链表是否相交

如果要求返回相交的第一个结点,那么我们需要先计算两个链表长度,然后从较长的那个链表开始向后移动,直到两链表剩下的相同,再逐一比较两个链表。比如链表1长100,链表2长50,我们先移动到链表1长50的的位置,然后与链表2一起一边向后移动一边比较。如果两个链表长度分别为N和M,请做到时间复杂度O(N+M),额外空间复杂度O(1)。现在有两个无环单链表,若两个链表的长度分别为m和n,请设计一个时间复杂度为O(n + m),额外空间复杂度为O(1)的算法,判断这两个链表是否相交。给定两个链表的头结点。

2023-04-03 11:01:35 60

原创 链表-5.12 判断链表是否有环

如上图所示,当slow和fast相遇后,链表头部到环入口的长度等于slow指针走c步再走n-1个循环,设置一个指针从头结点重新开始遍历,而slow(或fast)继续向后移动,当这两个指针相遇时,就是环入口的结点。fast一次走两步,slow一次走一步。如果fast遍历到了空结点,则说明无环。有环的话返回进入环的第一个节点的值,无环的话返回-1。如果链表的长度为N,请做到时间复杂度O(N),额外空间复杂度O(1)。为加密后的数据调整参数,方便数据设置,与本题求解无关),请返回所求值。给定一个单链表的头结点。

2023-04-02 11:54:10 80

原创 链表-5.11 复杂链表的复制

对于一个结点x,我们在它之后的位置再插入一个有相同值的结点(记为new_x)。然后再一次遍历,把new_x的random指针指向x.random.next(不能指向x.random,因为我们是要对原来的链表进行复制,必须指向和x.random具有相同值的新结点)。输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。输入:{1, 2, 3, 3, 1, 2}(前半部分是链表元素,后半部分是random指针指向的结点,random可指向空指针)

2023-04-01 11:45:16 29

原创 链表-5.9 链表回文串

假设一个指针quick每次向后移动两个结点,另一个指针slow每次向后移动一个结点,那么quick到达末尾时,slow正好到达链表中间位置。假设quick指针和slow指针初始时都位于第一个结点的位置,而链表总共n个结点,每一次前进,quick+2,slow+1。那么quick指针在第k次前进时到达末尾,即2k+1 = n(n为奇数) 或 2k+1 = n+1(n为偶数),而slow到达k+1(n为奇数)或k(n为偶数)。,请返回一个bool,代表链表是否为回文。请编写一个函数,检查链表是否为回文。

2023-03-31 20:29:57 33

原创 链表 5.7-链表的k逆序

在这个例子中,当遍历到尾结点时(Next == nil),直接返回。最终以k == 1为边界条件(k == 0时得到的是尾结点的下一个结点),并把下一个区间的第一个结点返回。例如链表1->2->3->4->5->6->7->8->null,K=3这个例子。调整后为,3->2->1->6->5->4->7->8->null。每次让cur.Next 指向 pre,完成翻转,然后nxt负责记录下一个需要翻转的结点,三个结点变为:pre = cur, cur = nxt, nxt = nxt.Next。

2023-03-30 17:19:34 70

原创 链表 5.6-打印链表公共值

同时维护两个指针curA,curB。因为headA,headB都是有序的,当curA的值小于curB时,就把curA向后移动;当遇到值相等的结点时,就把它们记录下来。,请返回一个vector,元素为两个链表的公共部分。请保证返回数组的升序。两个链表的元素个数均小于等于500。现有两个升序链表,且链表中均无重复元素。请设计一个高效的算法,打印两个链表的公共值部分。给定两个链表的头指针。返回:[2,4,6]

2023-03-29 11:31:26 33

原创 5.5 链表分化

对于一个链表,我们需要用一个特定阈值完成对它的分化,使得小于等于这个值的结点移到前面,大于该值的结点在后面,同时保证两类结点内部的位置关系不变。用两个链表分别保存小于等于val的结点和大于val的结点,最后拼接起来即可。注意链表末尾是需要取空的,否则会成环。,请返回一个链表,使小于等于它的结点在前,大于等于它的在后,保证结点值不重复。给定一个链表的头结点。

2023-03-28 14:46:48 29

原创 5.3 链表-删除结点/单个结点删除

经典链表删除题。原课程中题目过于简单,此处用leetcode代替。

2023-03-27 11:10:46 90

原创 5.2 链表-环形链表插入值

在环形链表的插入中,如果从头结点出发,走了一圈都没能发现可以插入的位置,说明要么这个数比所有数都大,要么比所有数都小,此时所以应该在原来的尾结点和头结点之间插入值,并且为了保证的有序性,如果是val比所有数都小,那么应该返回这个新插入的值。给定包含链表的所有元素的值(从头结点开始)的数组A,同时给定val,请构造出这个单链表,并返回插入该val值后的头结点。A和一个整数val,请你用A构造一个结点值有序的环形单链表,并对其插入一个结点值为val的结点,并且。

2023-03-27 10:53:02 61

原创 4.9 栈和队列-数组变树

对于一个没有重复元素的整数数组,请用其中元素构造一棵MaxTree,MaxTree定义为一棵二叉树,其中的节点与数组元素一一对应,同时对于MaxTree的每棵子树,它的根的元素值为子树的最大值。现有一建树方法,对于数组中的每个元素,其在树中的父亲为数组中它左边比它大的第一个数和右边比它大的第一个数中更小的一个。若两边都不存在比它大的数,那么它就是树根。请设计O(n)的算法实现这个方法。给定一个无重复元素的数组和它的大小。

2023-03-25 18:26:55 33

原创 4.8 栈和队列-滑动窗口练习题

有一个整型数组 arr 和一个大小为 w 的窗口从数组的最左边滑到最右边,窗口每次向右边滑一个位置。返回一个长度为n-w+1的数组res,res[i]表示每一种窗口状态下的最大值。以数组为[4,3,5,4,3,3,6,7],w=3为例。因为第一个窗口[4,3,5]的最大值为5,第二个窗口[3,5,4]的最大值为5,第三个窗口[5,4,3]的最大值为5。第四个窗口[4,3,3]的最大值为4。第五个窗口[3,3,6]的最大值为6。第六个窗口[3,6,7]的最大值为7。所以最终返回[5,5,5,4,6,7]。

2023-03-24 21:57:15 58 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除