- 博客(4)
- 收藏
- 关注
原创 Java实现最大堆和最小堆,解决Top K大与Top K小问题
有了上面的定理我们可以开始建堆,由于从heapSize / 2开始都是叶子节点,我们可以计算[0,heapSize / 2]范围的元素,这些元素都不是叶子节点,也就是存在子节点,将这些节点从后往前处理,使得其满足最大堆的性质。上面这个堆在数组中存储为[5, 3, 8, 4, 1],元素3下标为1,其左孩子4下标为1*2+1 = 3,右孩子1下标为1*2+2 = 4,父节点5下标为(1-1)/2 = 0,元素个数为5,从5/2 = 2下标开始都是叶子节点。每个节点都大于或等于它的子节点,堆顶元素是最大值。
2025-05-24 21:14:36
365
原创 二叉树最大深度与二叉树的直径
注意边的数量=深度-1,所以这里求直径最大的时候直接使用子树的深度就可以,不需要使用深度+1,另外这里需要使用一个额外变量ans来存储直径,函数返回的只是最大深度,直径需要不断比较进行维护,因为最长路径并不一定经过根节点。需要注意的是最长路径并不一定经过根节点,如果上面的树节点1还有左或右孩子节点7,那么直径为5,路径为7->1->2->3->4。比如这个二叉树直径为4,分别有两条路径,1->2->3->4,1->2->5->6。求二叉树直径的本质就是求树中每一个节点的左右子树最大深度和的最大值。
2025-04-22 21:08:24
199
原创 leetCode148 链表排序
这种方式实现了原地的排序,主要就是归并排序的思想,然后需要注意其中节点的变换,尤其是每次两个有序子链表合并时,需要将子链表尾部节点next置为null,同时每次循环pre和cur要进行移动,这样就实现了时间复杂度O(nlogn),空间复杂度O(1)的方式。但是这种方法需要用一个数组来存储链表中元素值,需要开辟新的内存空间,空间复杂度为O(n)
2025-04-22 19:53:25
138
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人