- 博客(22)
- 收藏
- 关注
原创 C#装箱和拆箱(文字部分有点多,希望大家能耐心看下去)
介绍了下C#中的装箱拆箱,以及涉及到底层的相关知识,如值类型、引用类型、堆栈内存的分配等。
2023-12-26 22:16:37
1107
原创 C#中List底层代码剖析
以上把List大部分接口都列举出来了,也对列举出来的接口进行了具体分析,可以看到,List的效率其实并不高,只是通用性强而已,大部分算法使用的是线性复杂度的算法,当遇到规模比较大的计算量级时,这种线性算法会导致CPU的内存大量损耗。当然,知道了问题所在,我们可以自己根据实际需求对其进行改造,比如不再使用有线性算法的接口,自己重写一套,但凡要优化List中线性算法的地方,都是用我们自己制作的容器类。
2023-11-29 19:14:39
1270
1
原创 一篇文章搞懂简单工厂模式、工厂模式、抽象工厂模式
简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式中,新增产品时需要修改工厂类,为了解决这个问题而出现了工厂模式。为了解决系列产品的问题,就有了抽象工厂模式。
2023-09-19 01:00:53
189
原创 代码随想录算法训练营第十六天:二叉树-104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数
注意区分出这两个概念:以这颗树为例:根节点的深度是1,高度是3节点9、20的深度是2,高度是2节点15、7的深度是3,高度是1。
2023-09-12 00:33:52
106
原创 代码随想录算法训练营第十七天:二叉树:110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和
左子树和右子树的高度差的绝对值不大于1,如图:树1的左子树的高度为3,右子树为2,高度差为1,所以是平衡二叉树树2的左子树的高度为3,右子树为3,高度差为0,所以也是平衡二叉树树3的左子树的高度为3,右子树为1,高度差为2,大于1,所以不是平衡二叉树。
2023-09-12 00:31:58
49
原创 代码随想录算法训练营第十六天:二叉树-104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数
数据类型的最大值,它被用作一个占位符,表示没有左子树或右子树的情况下,深度应该被认为是无穷大。这样,当我们比较左子树和右子树的深度时,如果其中一个子树为空,它的深度就会被认为是无穷大,从而确保我们选择另一个子树的深度作为最小深度。当我们计算左子树或右子树的最小深度时,如果该子树为空(即没有左子树或右子树),我们需要返回一个特定的值,以便在比较左右子树的深度时能够正确处理这种情况。这个做法是为了确保在比较深度时,空子树不会被错误地视为具有深度为0的情况,从而保证了正确的最小深度计算。
2023-09-11 23:23:09
41
原创 代码随想录算法训练营第十五天:二叉树-层序遍历、226.翻转二叉树、101. 对称二叉树
因此,我们需要借助另一种数据结构——队列,来辅助实现,队列用于保存每一层里面遍历过的元素。
2023-09-08 20:08:23
73
1
原创 代码随想录算法训练营第十四天:二叉树-递归遍历、迭代遍历
递归是定义一个对象或问题的方式,通过引用该对象或问题的较小版本来完成,比如斐波那契数列。
2023-09-07 22:07:29
68
1
原创 代码随想录算法训练营第十三天:栈与队列- 239. 滑动窗口最大值、347.前 K 个高频元素
仔细分析,滑动窗口很像一个队列,向下一个窗口移动的时候,Pop掉最前面的元素,Push进一个新元素,队列中始终维护这个窗口里面的值,每次都有一个GetMaxValue方法获取当前队列里的最大值。**不采用大顶堆的原因:**堆中维护了固定k个元素,如果向堆中加入一个元素,即push进来一个元素,那么就要pop一个元素,在堆里,pop是从堆顶进行操作的,如果采用大顶堆的话,就会把堆顶的值给弹出去,也就是把最大元素给弹出去了,所以采用小顶堆。所以可以自定义一个单调队列。队列中的元素从头到尾是按照递减顺序排列的。
2023-09-05 22:26:35
33
1
原创 代码随想录算法训练营第十一天:栈与队列-20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值
先说三种情况的共性:在遍历字符串时,遇到左括号时,将其对应的右括号放入到栈中,之所以将对应的右括号放入到栈中,是因为之后遍历到右括号时,方便直接与栈顶元素进行匹配,如果符合则可以直接从栈中弹出。在删除相邻重复项的时候,其实就是要知道当前遍历的这个元素,我们在前一位是不是遍历过一样数值的元素,利用栈来存放,即遍历当前的这个元素的时候,去栈里看一下之前是不是遍历过相同数值的相邻元素。第一次遍历到右括号时,与栈顶元素不匹配,说明中间有不对应的括号,不符合题目要求。3、计算完毕后,再将数据入栈,继续遍历字符串。
2023-09-05 20:33:39
41
1
原创 代码随想录算法训练营第十天:栈与队列-232.用栈实现队列、225. 用队列实现栈
3、Pop和Peek的时候,让stack1中的元素依次出栈,Pop进stack2中,这样stack2的栈顶元素就是队列的首元素,所以可以直接return stack2.Pop() 或 return stack2.Peek()2、每次入栈时,都把元素放到q2中,然后将q1中的元素依次出列并入队到q1,这样就能保证每次添加进来的元素都处于队列的首位。3、交换q1和q2,这样下次有新元素进来时,仍是先进入q2,再执行以上步骤。2、push的时候,只把元素push进stack1。1、定义两个队列q1和q2。
2023-09-05 17:05:32
110
1
原创 代码随想录算法训练营第九天:字符串-28. 实现 strStr()、459.重复的子字符串
主要思想:**当出现字符串不匹配时,可以记录一部分之前已经匹配的文本内容,利用这些信息避免从头再去做匹配。**具体的介绍请看文章讲解。
2023-09-05 17:04:47
56
1
原创 代码随想录算法训练营第八天:字符串-344.反转字符串、541反转字符串II、剑指Offer 05.替换空格、151.翻转字符串里的单词、剑指Offer58-II.左旋转字符串
在C#中,数组的长度是固定的,一旦创建后,就无法直接增加或减少其长度。个字符,那么在遍历的过程中只要每次移动2*k就可以了,然后判断是否有需要反转的区间。1、先将字符串的多余空格移除掉,这里可以使用双指针法,时间复杂度低一些。1、定义两个指针,一个从前往后遍历,一个从后往前遍历,两个相遇时停止。题目是对字符串操作,使用StringBuilder修改效率会更高。2、每次遍历时交换元素,然后两个指针同时往中间移动。3、再以空格为分隔点,将每个单词反转。2、将整个字符串反转。
2023-09-05 00:01:30
86
1
原创 代码随想录算法训练营第七天 | 哈希表-454.四数相加II、383.赎金信、15.三数之和、18.四数之和
四数之和的双指针解法是两层for循环nums[k] + nums[i]为确定值,依然是循环内有left和right下标作为双指针,找出nums[k] + nums[i] + nums[left] + nums[right] == target的情况,三数之和的时间复杂度是。(以下采用B) 由小写英文字母组成,且当A能用B里面的字符组成时才返回true,典型的在B中查找所需元素的问题,而且又因为明确小写字母构成,数据数量固定,所以采用数组,数组存放的是下标对应的字母出现的次数,比如a对应下标0,b对应1…
2023-08-30 22:40:05
65
1
原创 代码随想录算法训练营第六天 | 哈希表-242.有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和
遇到哈希表的时,数组、HashSet、HashMap分别在什么时候用数组:数值比较小,且比较集中(如只有0、5、100000这三个数时,就要开100000长度的数组,空间浪费)HashSet:没有数值限制,可能有上亿个时HashMap:在需要用到键值对时采用。即Key-value的存储结构。
2023-08-29 21:57:20
42
1
原创 代码随想录算法训练营第五天 | 数组、链表总结
/节点上存储的元素//指向下一个节点的指针public ListNode(int val=0, ListNode next=null) //节点的构造函数。
2023-08-29 16:13:34
52
1
原创 代码随想录算法训练营第四天 | 链表-24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题02.07.链表相交、142.环形链表II
day04:24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题02.07.链表相交、142.环形链表IILeetCode 24.两两交换链表中的节点题目链接:24.两两交换链表中的节点文章讲解:https://programmercarl.com/0024.%E4%B8%A4%E4%B8%A4%E4%BA%A4%E6%8D%A2%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9.html视频讲解:https://www.
2023-08-29 14:45:21
54
1
原创 代码随想录算法训练营第三天 | 链表-203.移除链表元素、707.设计链表、206.反转链表
cur等于dummyHead是因为我们要删的其实是cur.next,那么就必须要知道cur.next的上一个指针是什么,也就是cur,只有删的是cur.next,才能让cur直接指向cur.next.next。= null,如果cur.next指向的值等于val,则将cur.next指向cur.next.next,若不等于,则cur接着往下走,即cur=cur.next。4、最后return head,因为对链表进行操作的时候,是定义了一个临时节点cur进行遍历的,head还是指向一开始操作的这个链表。
2023-08-27 21:55:55
98
原创 代码随想录算法训练营第二天 | 数组-977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵 II
虽然上述代码中有两个while循环,但主要是看每一个元素被操作的次数,每个元素在滑动窗口后进来一次、出去一次,即每个元素都被操作两次,所以时间复杂度是2*n,也就是。4、循环结束条件为 i
2023-08-27 18:14:02
77
原创 代码随想录算法训练营第一天 | 数组-704.二分查找、27移除元素
上述两题涉及到的方法虽然看上去很复杂,但只要跟着思路把每一步、每次一遍历画出来,就很容易理解了,多画图!
2023-08-23 22:59:45
305
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人