获得徽章 0
今天我学习了跳表,跳表是一种用于快速查找有序元素的数据结构。跳表通过在多层链表中建立索引节点,使得查找的时间复杂度能够降低到O(log n)。在跳表中,每一层都是原始链表的一部分,同时每层的节点都包含了指向下一层的指针。这种设计使得通过索引层快速定位到目标节点,然后再在低层进行逐步查找,从而提高了查找速度。它在某些情况下可以替代平衡树来进行高效的查找操作。
评论
今天我遇到了一个关于二叉树的问题,需要在二叉树中搜索特定的值。二叉树是一种常见的数据结构,在每个节点上有一个值,并且每个节点最多有两个子节点。我回顾了二叉树的基本性质。在二叉树中,可以通过递归的方式来遍历每个节点。通常有三种遍历方式:前序遍历、中序遍历和后序遍历。考虑到问题的要求是搜索特定的值,我选择了中序遍历。中序遍历的过程是先访问左子树,然后访问根节点,最后访问右子树。通过在遍历过程中判断当前节点的值是否与目标值相等,如果找到了目标值,记录下节点的位置或其他需要的信息。。这个算法的时间复杂度取决于树的高度,最坏情况下是O(n),其中n是节点的数量。因为需要遍历整个树来搜索特定的值,所以时间复杂度是线性的。
展开
评论
今天遇到了一个有趣的问题,关于山脉数组的峰顶索引。山脉数组是指在某一个索引位置i前升后降的数组。问题是要找到山脉数组中的峰顶元素。我思考了一下问题的要求。峰顶元素是指数组中最大的元素,它大于其相邻的两个元素。由于数组是升序后降序的,所以峰顶元素一定存在。需要找到一种高效的解决方法。我决定采用二分查找来解决这个问题。二分查找适用于有序数组,而山脉数组的升降特性可以将其划分为两个有序的部分。具体的步骤是先找到数组的中间元素middle,判断middle元素与其相邻元素的关系。如果middle大于其相邻元素,则峰顶元素一定在middle的左侧;如果middle小于其相邻元素,则峰顶元素一定在middle的右侧。不断缩小查找范围,直到找到峰顶元素为止。希望能够不断提升自己的算法和编程能力。
展开
评论
今天在尝试解决一道算法题。。。看不懂,绕不过来。题目要求不使用乘法,除法,求余来求一个除法算式的商、我???想不出来是怎么解的,看了看答案,更懵逼了。答案说通过位操作找到 dividendAbs 中最大的一个除数的倍数,使其不超过 divisorAbs。具体做法是将 divisorAbs 左移,同时记录左移的次数 count。将 count 加到 result 上,表示找到了 count 个 divisorAbs,即将其加到 dividendAbs 中。我???真的心累。
展开
评论
今天在学习二分查找的算法的时候,发现了段神奇的代码,通过一个boolean变量来控制找到一个值的左边界和右边界,看了好久才明白是怎么遍历出来的,真的厉害,路漫漫其修远兮,吾将上下而求索
public int binarySearch(int[] nums, int target, boolean lower) {
int left = 0, right = nums.length - 1, ans = nums.length;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] > target || (lower && nums[mid] >= target)) {
right = mid - 1;
ans = mid;
} else {
left = mid + 1;
}
}
return ans;
}
展开
评论
今天学习了二叉树的层序遍历以及变换,层次遍历就是从根节点开始,先访问根节点下面一层全部元素,再访问之后的层次,类似金字塔一样一层一层访问。只需要使用一个队列记录下每一层的元素,然后在出队列时把节点的下一层元素放进队列即可,当队列元素为空时,遍历结束。
评论
今天我学习了如何根据给定的前序遍历和中序遍历序列生成二叉树。这是一个常见的问题,在构建二叉树的过程中,前序遍历序列提供了根节点的信息,而中序遍历序列提供了左子树和右子树的分割点。

具体的步骤如下:

定义一个函数,接收前序遍历序列 preorder 和中序遍历序列 inorder 作为参数,并返回该二叉树的根节点。
在函数中,首先检查前序遍历序列是否为空或者长度为零,如果是,则返回 null。
创建根节点,值为前序遍历序列的第一个元素 preorder[0]。
在中序遍历序列中找到根节点的位置,将序列分为左子树和右子树部分。
递归调用函数,传入左子树部分的前序遍历序列和中序遍历序列,并将返回的节点作为根节点的左子节点。
递归调用函数,传入右子树部分的前序遍历序列和中序遍历序列,并将返回的节点作为根节点的右子节点。
返回根节点。
通过以上步骤,我们可以根据给定的前序遍历和中序遍历序列生成对应的二叉树。
展开
评论
今天学习了树的算法,树是一种非常重要且常用的数据结构。它通过节点和边的关系来表示数据的层次结构。树的遍历算法让我对树的结构和操作有了更深的理解,包括先序遍历、中序遍历和后序遍历。我还学习了树的常见应用,如二叉搜索树和平衡树。
评论
今天学习了LFU算法设计,主要思想是通过两个哈希表来实现,一个哈希表存储数据使用频率,另外一个哈希表存储数据相应节点,频率哈希表中的每个值为一个双向链表,来存储相同使用频率的数据
评论
今天 学习了LRU缓存设计,解决思路是使用双向链表和哈希来解决,双向链表来存储数据,哈希键为索引,值为链表节点,这样可以在O(1)的时间内获取或者修改缓存数据;当缓存超过容量时,只需要删除尾部节点即可。
评论
今天学习了跳表的基础知识和相关实现原理,然后学习了zset,总算吧redis的对象都学习了一遍,明天复习一遍就开始学习其它的内容,加油
评论
今天学习了四数之和,在测试中遇到了一些问题:
输入是:nums =[1000000000,1000000000,1000000000,1000000000],-294967296;
预测输出应该是:[];但是实际输出是:[[1000000000,1000000000,1000000000,1000000000]],
我怀疑应该是int的范围问题,正在一步一步调试尝试解决
展开
评论
今天学习了如何使用栈来实现队列和如何使用队列实现栈,尝试解决了两数之和和n数只和的算法,虽然只是增加了一个数,但是难度增加了很多。现在在尝试解决四数只和的问题,加油
评论
今天学习了栈的创建和一些面试题,主要是对于字符串中括号的判断,是否是有效括号,还有括号的所有有效形式等等,用到了回溯思想。。。太难了,其它的解法都看不懂,只能从回溯算法下手,力扣的困难题是真困难啊
评论
今天学习了双指针在数组中的应用,主要有三种方法:快慢指针法,对撞指针法,对撞指针+覆盖法。
评论
今天学习了K 个一组翻转链表的算法,可以使用头插法或者穿针引线法解决;头插法的时间复杂度和空间复杂度都鱿鱼穿针引线法;
评论
今天学习了一些链表反转的算法:
指定区间反转
头插法
穿针引线法
两两交换链表中的节点
单链表加一
链表加法
回文链表
k个一组反转链表
头插法
穿针引线法
展开
评论
今天学习了链表反转问题;链表反转主要有三种方法,分别是建立虚拟头结点,直接操作链表指针迭代反转,递归反转;递归反转这个思路太妙了,顺带写了写其他递归解决的算法题,打开了递归的一道大门,之前上课的时候学到过但是没有想过其它用法,了解递归的原理后解决其它问题又多了一种思路
评论
下一页
个人成就
文章被阅读 83
掘力值 20
收藏集
0
关注标签
16
加入于