如果你已经对数据结构与算法略知一二,现在正在复习数据结构与算法的一些重点知识
-------------------------------------------------------------------------------------------------------------------------
点赞+收藏🌈,每天更新总结文章(多以图文形式,方便记忆,均为网上搜集资料以及AI)⭐
-------------------------------------------------------------------------------------------------------------------------
时间:2025/5/23/ 19: 40分
-----------------------------------种一棵树最好的机会是十年前,其次是现在
博主链接:黎明smaly-CSDN博客
快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区
一、LeetCode 283.移动零
方法一:
- 题目中,要求我们在原数组进行原地操作,所以先排除哈希这些
- 一般对于数组的题,要求原地进行的,首先考虑双指针
- 这道题我们采用双指针,我们定义一个左指针和一个右指针,这里的指针可以采用下标的方式进行,而不是真正意义上的指针变量
- 左右指针同时指向第一个元素
- 右指针先走,如果碰到0,继续走++,如果碰到非0,也就是我们要的元素,则将他赋值给左指针对应的元素,左指针才走++
- 走到右指针走到结尾为止,这样,我们就拿到了所有的非0元素,并且相对顺序不变
- 只不过 后面的元素还不是0,最好我们需要把循环方式把剩下的元素赋值成0
代码:
时间复杂度:O(N) N是数组的长度
空间复杂度:
O(1)
二、LeetCode 11.盛最多水的容器
方法一:
- 看到跟数组相关的,又是求某个阶段最大/最小值问题的,我们可以考虑贪心算法
- 我们还是采用双指针的方式,左,右指针,左指针指向开头,右指针指向结尾
- 此时这两个指针间,最大可容纳水为 min(1,7)*8 = 1*8=8 (按示例图来的)
- 然后我们将这个最大值记录下来,此时就知道了一个局部解
- 移动指针,移动数字小的那个指针,只有数字小的移动,才能找到更大值,不然最大空间一直卡在了数字小的上面,因为有瓶颈
- 移动完继续计算最大可容纳水量 min(8, 7) * 7 = 1*7 = 7
- 此时又拿到了一个局部解,将其与上一次的进行判断,大的存到我们定义的最大值变量里面,等下一次判断继续用
- 不断这样循环,如果两个指针值相同,那么可以随便移动一个
- 直到左右指针重合,此时最大值变量里面存的就是最大可容纳水量
代码:
时间复杂度:
O(N) N是数组长度
空间复杂度:
O(1)
三、LeetCode 15.三数之和
先仔细看题目,明白题意,再做题
方法一:
- 如果我们按照暴力枚举的方式,需要O(N^3)次方时间复杂度,并且我们最后还有去重
- 我们寻找新的思路,简化一些,我们发现题目无非是要求找出数组中三数之和=0的,
此时就能想到了有一道题叫两数之和,也是数组的- 我们写第一层循环,来找第一个数,其余的两个数我们当作两数之和这道题来做,
第一个数找到后,其余两数之和就是 0-第一个数- 我们首先要对数组进行排序,排序是为了去重,也是为了更好的求两数
- 写第一层for循环,找到每个三元组的第一个数
第二层循环 设置左右双指针,左指针指向第一个数右边的数也就是i+1,右指针指向尾巴
判断左指针+右指针是否0-第一个数,如果等于,则找到了第一个三元组
如果!=0,且大于0-第一个数,则代表值大了,右指针向左移动,因为已经排序过了,右边的值是最大值,所以它移动一位变小一点
然后继续判断,如果值小了就左指针向右移动一位变大些- 如此下去,就能找到所有的三元组,然后我们要处理去重的问题
我们在上面的基础下加一些判断条件即可,找到一个三元组后,左右指针分别移动到跟当前值相比的非重复值上,去重代码:
时间复杂度:
O(N^2)
空间复杂度:
O(logN)
总结:⭐
这三道题都是跟双指针有关的
对于双指针的使用要熟悉
加油,为了更好的明天!
种一棵树最好的机会是十年前,其次是现在