- 博客(27)
- 收藏
- 关注
原创 LeetCode 125. 验证回文串
我们可以定义两个指针,一个指向字符串的开头,另一个指向字符串的末尾。然后,不断向中间移动指针,同时比较两个指针指向的字符是否相同。如果两个指针相遇,则字符串是回文串。我们不断比较指针指向的字符是否相同,如果有不相同的字符,则字符串不是回文串;如果两个指针相遇,则字符串是回文串。的每个字符,判断是否是字母或数字,如果是,则将其转换为小写并添加到。最后,如果遍历过程中没有发现不相同的字符,说明字符串是回文串,返回。我们需要遍历字符串构建新的字符串,并使用双指针进行判断。,分别指向字符串的开头和末尾。
2023-06-21 18:39:21
150
1
原创 LeetCode 14. 最长公共前缀
我们可以从第一个字符串的第一个字符开始,逐个字符地与其他字符串进行比较。如果在比较过程中发现不相同的字符,或者某个字符串的长度已经达到了最短字符串的长度,则停止比较。最后,我们将相同的字符添加到结果字符串中,并返回最长公共前缀。然后,我们遍历第一个字符串的每个字符,并与其他字符串的相同位置的字符进行比较。在比较字符之前,我们还要确保索引不会超出其他字符串的长度,以防止越界错误。如果发现不相同的字符或某个字符串已经达到最短字符串的长度,则停止比较。,我们需要找出一个字符串,它是所有字符串的公共前缀。
2023-06-21 18:32:22
104
原创 Leetcode 238. 除自身以外数组的乘积
我们可以先计算每个位置左侧所有元素的乘积,然后再计算每个位置右侧所有元素的乘积。最后将左侧乘积和右侧乘积相乘,就得到了所需的结果。然后,我们从左到右遍历数组,计算每个位置左侧所有元素的乘积,并将结果保存在。从右到左遍历数组,计算每个位置右侧所有元素的乘积,并将其与左侧乘积相乘,更新。这道题目要求计算一个数组中除了当前位置之外的所有元素的乘积数组。,我们需要返回一个新的数组,其中每个元素是原数组中除了自身之外所有元素的乘积。我们需要遍历两次数组来计算左侧乘积和右侧乘积。首先,我们初始化结果数组。
2023-06-18 15:59:38
129
原创 Leetcode 45. 跳跃游戏 II
数组中的每个元素表示在当前位置最多可以跳跃的步数。我们需要确定是否存在一种跳跃方式,能够到达数组的最后一个位置。的值为当前位置加上能够跳跃的最大步数,确保能够跳到更远的位置。这道题目要求判断是否能够从数组的起始位置跳跃到最后一个位置。最后,如果能够遍历完整个数组,说明可以成功到达最后一个位置,我们返回。最后,如果能够遍历完整个数组,说明可以成功到达最后一个位置,返回。我们只需要遍历一次数组来判断是否能够到达最后一个位置。,表示当前能够到达的最远位置。,则意味着无法到达当前位置,我们返回。
2023-06-18 15:53:48
112
原创 Leetcode 122. 买卖股票的最佳时机 II
这个题解的关键点在于贪心选择,即每次都选择局部最优解,使得最终的结果也是全局最优解。在这个问题中,我们只关注价格上涨的情况,因为只有在价格上涨时才能获得利润。而对于价格下跌的情况,我们选择不进行买卖操作,以免造成亏损。我们需要进行 n-1 次价格差的计算,因为我们比较的是相邻两天的价格。如果价格差大于零,则将利润累加到。来计算相邻两天的价格差,如果价格差大于零,则认为存在利润。这个算法的时间复杂度为 O(n),因为我们只需要一次遍历来计算最大利润。这个解法使用了贪心算法的思想。
2023-06-18 15:50:21
103
原创 LeetCode 189. 旋转数组
这个问题的主要解决方案是使用一个额外的数组来帮助我们旋转。为了得到旋转后的位置,我们可以考虑原数组中的每一个元素,在旋转后数组中应该处于的位置。对于原数组中的第 i 个元素,向右移动 k 个位置后,它应该处于。给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
2023-06-15 21:43:06
92
原创 LeetCode 121. 买卖股票的最佳时机
你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。,分别表示到目前为止所遇到的最小股票价格和最大可能的利润。然后我们检查卖出股票能否获得更高的利润,即当前价格减去。遍历过程中,对于每一个价格,我们首先检查是否需要更新。个元素是一支给定的股票在第。更低,如果是,我们更新。给定一个数组,它的第。
2023-06-15 21:37:54
62
原创 Leetcode 80删除有序数组中的重复项 II
这个问题的主要解决方案是使用一个变量 index 作为新数组的索引。对原数组进行遍历,当遍历到的元素不等于新数组前两个元素,或者新数组长度还不到2时(即还没有两个元素),就将遍历到的元素放入新数组。给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素最多出现两次,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
2023-06-15 21:29:09
57
原创 Leetcode26.删除有序数组中的重复项
这个问题的主要解决方案是使用双指针法,一般称为快慢指针。快指针(fast)用来遍历数组,慢指针(slow)用来标记不重复的元素的位置。当遍历过程中,快慢指针指向的元素不相等时,慢指针向前移动一位,并将快指针所指向的元素复制到慢指针的位置。遍历结束后,slow 的位置就是新的数组长度。给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
2023-06-15 21:22:03
68
原创 Leetcode 118. 杨辉三角
对于杨辉三角的每一行,首尾元素都是 1,中间的每个元素是上一行相邻两个元素之和。这就是我们的转移关系,利用这个关系我们就可以生成杨辉三角。给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
2023-06-14 11:08:21
53
原创 Leetcode 70. 爬楼梯
阶的爬法是前一阶的爬法加上前两阶的爬法。特别地,第 1 阶只有一种爬法(爬 1 阶),第 2 阶有两种爬法(爬 2 阶或者爬两次 1 阶)。需要 n 阶你才能达到楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?这是一个典型的动态规划问题,我们可以通过一维动态规划表来解决。
2023-06-14 11:01:36
52
原创 Leetcode153. 寻找旋转排序数组中的最小值
假设按照升序排序的数组在预先未知的某个点上进行了旋转。该题可以通过二分查找的方法求解。在查找过程中,我们比较。请找出其中最小的元素。注意数组中可能存在重复的元素。
2023-06-14 10:50:15
179
原创 Leetcode33. 搜索旋转排序数组
这个问题的关键是理解二分查找。对于旋转后的升序数组,可以发现的规律是:不论我们取数组中的哪一个元素,至少有一半的元素是有序的。请你在数组中搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回。一个整数数组 nums 按升序排列,然后在未知的某个点上进行了旋转(例如,
2023-06-14 10:46:22
44
原创 Redis深度解析(九):Redis对象系统浅析(下)
在Redis这个高效的键值数据库中,存在着一些我们日常可能不常关注的特性和细节。它们包括类型检查与命令多态,内存回收策略,以及对象共享等。在这篇文章中,我们将对这些细节进行深入的解析。
2023-05-30 20:45:46
105
1
原创 Redis深度解析(八):Redis对象系统浅析(中)
Redis是一个非常高效的键值数据库,支持多种不同类型的数据结构,包括字符串、列表、哈希表、集合和有序集合等。在这篇文章中,我们将详细介绍Redis的列表对象、哈希对象、集合对象和有序集合对象,包括它们的编码方式,以及在何种情况下会自动进行编码转换。
2023-05-28 17:36:14
71
1
原创 Redis深度解析(七):Redis对象系统浅析(上)
Redis中的每个对象都由redisObject结构组成,主要包含type、encoding和ptr三个属性。type:此属性用于标识对象的类型。Redis支持的对象类型包括字符串、列表、哈希表、有序集合等。这些类型的数据结构,为满足各种数据操作需求提供了基础。encoding:此属性用于标识对象的编码方式。同一种类型的对象可以采用多种编码方式,这种设计主要是为了在不同场景下优化存储和访问性能。
2023-05-28 17:26:12
98
1
原创 Redis深度解析(六):压缩列表的实现与优势
压缩列表是一种特殊的数据结构,主要用于存储较小的列表和哈希表。其特点在于使用连续的内存空间存储数据,由多个连续的节点组成,每个节点可以存储一个字节数组或整数。压缩列表由多个连续的节点组成,每个节点包括三个部分:前置节点长度(用于定位前一个节点),节点标志(表明节点存储的数据类型),以及节点值(存储的数据)。这种设计使得压缩列表在存储效率和性能方面具有很大优势。
2023-05-28 17:21:14
375
1
原创 Redis深度解析(五):整数集合的实现与原理
整数集合(IntSet)是一种特殊的数据结构,用于存储整数类型的数据。整数集合常用于Redis中的有序集合(SortedSet)和哈希表(Hash)等数据结构。整数集合的底层实现方式类似于数组,但由于其特殊的优化策略,使其具有更高的效率和更小的空间占用。整数集合的实现是一个有序、无重复的数组。Redis根据需要存储的整数范围,选择使用int16_t,int32_t,或int64_t来存储数据,以节省空间。
2023-05-28 17:19:52
158
1
原创 Redis深度解析(四):跳跃表的实现与原理
在一般的链表中,如果我们需要查询一个元素,可能需要遍历链表,这样的时间复杂度是O(n)。而跳跃表通过维护一个多层的链表,为链表查询提供了“快速通道”。在跳跃表中,每一个节点包含多个“层”,每一层都有一个前进指针指向下一个节点,通过这种方式,跳跃表能够在横向和纵向上进行查询,大大提高了查询效率。
2023-05-28 17:17:16
347
1
原创 Redis深度解析(三):字典的实现与哈希冲突解决
Redis字典的实现充分考虑了性能和内存效率,采用了一系列优化策略来保证其高效的运行,包括使用了MurmurHash算法,采用链地址法处理哈希冲突,以及通过渐进式rehash避免操作的长时间阻塞等。
2023-05-28 17:10:47
443
1
原创 Redis深度解析(二):链表的实现与应用
在Redis的众多数据结构中,链表扮演着非常重要的角色。今天,我们将深入探讨Redis的链表实现,以及链表在Redis中的应用场景。
2023-05-28 17:06:43
231
1
原创 Redis深度解析(一):深入理解简单动态字符串(SDS)
简单动态字符串,简称SDS,是Redis的默认字符串表示。它解决了C语言中常见的字符串表示的几个关键问题,提供了长度信息、动态内存管理以及二进制安全存储等特性。接下来,我们将通过代码段来详细解析这些特性。
2023-05-28 16:57:49
339
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人