- 博客(54)
- 收藏
- 关注
原创 查找元素在数组中的下标,vector
find返回x在nums2中迭代器的位置,distance计算it迭代器,返回x的数组下表。哈希映射,将数组元素存储到哈希表里。
2024-09-07 10:50:36
178
原创 使用最小花费爬楼梯
/dp[i+1]收到dp[i]和dp[i-1],的影响,dp[i+2],也是,但如果思考dp[i-1]和dp[i-2]对dp[i]的影响。//最开始想的时候,思考dp[i]推导dp[i+1],dp[i+2],dp[i]定义为爬到当前楼梯的最小值,但是。//dp[i-1]和dp[i-2]都是前面定义好的最小值,这样我只需要考虑后面的,影响因素少了。//另外,对dp[0]和dp[1]的初始话也很重要,
2024-08-07 11:22:32
267
原创 linux“how_paras.sh“ E212: 无法打开并写入文件
ls: 无法访问hello.sh: 没有那个文件或目录,为什么在/bin文件下却不能打开,通过find寻找文件路径,然后打开,就可以了,搞了半天居然是路径出问题了。经过一番测试和查找,
2024-08-03 11:21:11
373
原创 买卖股票的最佳时机 动态规划
之前打算法比赛的时候写了很多动态规划的问题,但是到现在我仍然认为自己是个小菜鸡,学徒一枚,动态规划的难点在于看出递归的模型,否则就只能用暴力解了。最开始拿到这道题的时候想的是选取数组中的最小值,然后与后面的最大值相减,但是万一前面也有更小的值怎们办。也就是这行代码,看看下一个状态是从前面继承海=还是从当前位置更新,这个时候可以采用动态规划的递归思路,
2024-08-02 09:32:43
154
原创 优先队列 前 K 个高频元素
所谓的的堆就是一个完全二叉树树中每个结点的值都不小于(或不大于)其左右孩子的值 如果父亲结点是大于等于左右孩子就是大顶堆,小于等于左右孩子就是小顶堆。
2024-08-01 10:59:34
331
原创 二分法的常见套路
当我们将区间[l, r]划分成[l, mid - 1]和[mid, r]时,其更新操作是r = mid - 1或者l = mid;参考这个图,L+3=r时,经过一次递归,会变成l+2=r,l+2=r经过一次递归会变成l+1=r,也就是我们写的终止条件。看这个图片,寻找第一个小于等于2的数字,如果条件满足l才会移动,也就是说,l本身以及l左面的元素都应该是小于等于2的。「二分」的本质是两段性,并非单调性。如果让l=0,那么3这个数字明显是不满足条件的所以初始化为-1,同理r初始化为数组元素也是如此。
2024-07-26 10:58:45
1478
原创 linux root登陆,密码正确但,错误提示su: Authentication failure
初开始登陆的时候会显示失败,参考了很多网上的做法,但还是不行,但是,如果用键盘左边那一排数字按键输入,就可以正常登陆(之前用的是右边的九宫格)
2024-07-24 16:30:41
503
原创 回溯题目的套路总结
昨天写完了LeeCode的7,8道回溯算法的题目,写一下总结,这类题目的共同特点就是暴力搜索问题,排列组合或者递归,枚举出所有可能的答案,思路很简单,实现起来的套路也很通用,一回溯问题为例,常用的是构建一颗搜索树,bfs,dfs模板函数名(递归参数)if(这里是终止条件)一般达到终止条件就需要把答案放入for()push,压入元素,函数名(递归参数)//这里是往下一层进行递归pop递归失败,弹出压入的元素这里是写了一个大致的模板,实际的题目还要对照画出一颗树形图更合适,并且方便理解。
2024-07-22 11:15:16
271
原创 LeetCode 子集
这道题采用顺序递归(我想的名字),举个例子,1,2,3,如果我先选了1,那么按照从左到右的顺序剩下的子集里可选的就是2,3,我下面要从2,3当中选一个,如果选2,那么按照从左到右的顺序,下面可选的子集就只有3.如果我选3呢,那么按照从左到右的顺序,剩下的子集里就没有可选的了,因为从左到右吗,2被我们跳过了,选了3之后就该选3后面的。要完成前面这几步有一个重要的前提条件,你要确定采用什么样式的递归,这个来源于解题经验,3.做出选择,递归调用进入下一层。4.回溯,返回到递归前的状态。1.确定递归参数变量。
2024-07-01 10:36:22
320
原创 LeetCode 全排列
题目给我们一个数组,我们很容易想到的做法是将数组中的元素进行排列,如何区分已选中和未选中的元素,容易想到的是建立一个标记数组,已经选中的元素标记为true,这里采用了另一种做法,采用first这一个常量指针,将数组分割为,为选中元素的数组,和已选中元素的数组,然后就是排序问题,在backtrack函数里有一个for循环,通过指针i来遍历未选中数组中的元素,得到所有可能的组合。
2024-06-30 10:35:55
413
原创 LeeCode 实现 Trie (前缀树)
this是一个指针,指向了s,因为class的特性类似于结构体,this->age直接调用Student的age。例如二叉树每个节点有两个子节点,Trie树则有26个子节点,我们的任务就是根据给定的变量。另外,this只能在class Student的成员里使用才有效,在其他地方使用是违法的。思路:这道题的思路已经写在了题目里,采用Trie树,又称字典树,类似于二叉树,例如,apple和app,appc相同的前缀,路径也是相同的。这里的当前对象就是s。这里的this指的是当前对象的指针,比如。
2024-06-29 10:50:51
305
原创 LeetCode 207. 课程表
思路:这是一道拓扑排序问题,拓扑排序听起来可能有点复杂,但实际上它是个相当直观的概念。想象一下,你有很多事情要做,但有些事情必须在另一些事情完成之后才能开始,就像你得先穿上袜子再穿鞋子拓扑排序就是把这种图中的所有任务排成一个列表,让每个任务满足它的所有前置任务都在它前面。这样,当你按照列表的顺序去做事,就能保证每件事都在它需要的时候完成了。实现拓扑排序。
2024-06-28 10:48:51
578
原创 LeeCode 994. 腐烂的橘子
思路:采用bfs遍历图,将烂橘子加入队列,然后将被烂橘子感染的橘子也加入队列,bfs的具体细节就不多说了,可以自己去搜,很简单,这里主要写本题需要注意的问题。是假设是每分钟只有一个橘子变坏,但同时间有很多坏橘子,这些坏的橘子同时影响别的橘子。第一个时间问题,很多橘子同时感染,如果按照传统的bfs方法去写。所以需要改进,这里采用bfs的一个特性,最短路径的记录,过程看图。这样就可以记录那个橘子是什么时候烂的。
2024-06-27 10:29:58
264
原创 LeetCode 从前序与中序遍历序列构造二叉树
/ 树的根节点在前,对于左右子树,采用的遍历方式也是根节点->左子树->右子树,所以可以看出一旦确定了左右子树长度。//中序遍历顺序左子树|根节点|右子树,对于为无重复元素的二叉树来说,可以在前序遍历的数组中找到根节点,然后将根节点。//中序遍历的数组的作用是为我们提供左右子树的大小,分割左右子树,前序遍历的数组作用是为我们提供树的根节点的大小。//然后进行递归,对分割好的左右子树在进行分割,知道不能分割为止。//对应到中序遍历的数组中,分割出左右子树,得出左右子树的长度。// 根节点|左子树|右子树。
2024-06-22 10:31:24
319
原创 LeetCode 验证二叉搜索树
/为了保证二叉搜索树的正确性,需要根节点左子树的所有值都小于根节点,右子树的所有节点的值呀大于根节点。//lower维护的是当前所遍历到的节点中所能取到的最小值,upper是最大值。//(lower,upper)这是一个不断更新维护的区间,为什么要更新维护。
2024-06-17 11:08:08
169
原创 LeetCode 平衡二叉搜索树
/在根结点处将数组一分为二,考虑左节点,应该选取左半数组中的那个数?都不行,需要选中间的。//平衡二叉搜索数,关键在于平衡两个字,左右数的高度差不超过1,搜索树,左节点小于 根节点 小于右节点。//先谈平衡,我们找到数组的中间节点作为数的根节点,这个方法被论证过是可行的,然后我们要构建左右子树,//左节点这颗子树也要是一颗平衡二叉搜索数,我们采用递归来构造。
2024-06-16 10:27:06
375
原创 LeetCode LRU缓存
原本指南针这个应用是再队列的最后一位,当我打开他一次后,他就跑到前面了,另外假设容器的容量为4,我再打开一个新的应用,那么,在最后一位的计算器就要被关掉。普通的队列可以根据元素被压入的时间进行排序,但不能访问队列中间的元素,也不能提出,哈希表可以实现查询功能,但不能实现按照元素被访问时间进行排序,如果我们把他们结合起来,组成哈希链表,既有了哈希表的查询功能,也有了链表的先后顺序功能。这里采用的是双向链表代码如下,逻辑比较简单,主要是函数的调用。
2024-06-07 09:28:14
1513
原创 LeetCode 随机链表的复制
在普通的链表中,每个节点只包含一个值和一个指向下一个节点的指针。因此,当我们进行深拷贝时,只需要遍历原始链表,为每个节点创建一个新节点,并保持它们的。指针应该指向哪个新节点,因为我们还没有创建那些在原始链表后面才出现的节点。然而,在这个特殊的链表中,每个节点除了包含一个值和一个指向下一个节点的指针之外,还有一个。如果我们只是简单地遍历原始链表并为每个节点创建一个新节点,那么我们将无法知道新节点的。指针指向原始链表中的某个节点,而不是新创建的副本节点。指针复制到新节点,因为这样做会导致新节点的。
2024-06-03 10:35:09
405
原创 LeetCode 两数相加
思路:这道题需要注意的的点就是进位,两个数相加后如果产生进位,就要在下一位相加时添加上1,这里用addition这个变量储存,如果产生进位,addition=1,加在下一个数上。另外就是补位问题,如果两个数位数不同,对较短的链表补位,方便下面相加。
2024-05-28 10:32:16
250
原创 Leetcode 环形链表|| 快慢指针解法
但是我们不知道 aaa 的值,该怎么办?依然是使用双指针法。考虑构建一个指针,此指针需要有以下性质:此指针和 slow 一起向前走 a 步后,两者在入口节点重合。那么从哪里走到入口节点需要 aaa 步?答案是链表头节点head。
2024-05-26 09:41:40
254
原创 leetcode 环形链表
两个指针进入环里后会在环里循环,然后由于快指针比慢指针走的要快一步,就像操场上的两个人跑步,跑的快的人追上了跑的慢的人,相遇的那一刻,发生了套圈。如果有环,必然会发生套圈(两个指针相遇)。思路,采用快慢指针,块指针一次走两步,慢指针一次走一步,如果有环存在,那么这两个指针都会进入环里。
2024-05-24 16:55:46
249
原创 Leetcode 反转链表
思路:采用双指针算法,pre指向前一个节点,cur指向pre后面的节点,这里的temp是个临时变量,用来储存cur里next指向的下一个节点,两个指针不断移动,并且更改两个指针所指节点链表指针的指向。
2024-05-19 09:27:26
204
1
原创 LeetCode 相交链表,适合刚学链表的新手
这里的链表是用结构体来写的,ListNode* p创建的是结构体指针,p->next是访问结构体里的成员变量,不用像原来那样还要在后面加一个".",next里指向的是下一个节点的指针,p=p->next将下一个节点的地址赋给p指针。之前学过链表,但是这是第一次写与链表有关的题,我会把比较基础的地方写详细一点。
2024-05-18 11:24:40
214
原创 力扣 旋转图像
根据以上「元素旋转公式」,考虑遍历矩阵,将各元素依次写入到旋转后的索引位置。但仍存在问题:在写入一个元素 matrix[i][j]→matrix[j][n−1−i]matrix[i][j] \rightarrow matrix[j][n - 1 - i]matrix[i][j]→matrix[j][n−1−i] 后,原矩阵元素 matrix[j][n−1−i]matrix[j][n - 1 - i]matrix[j][n−1−i] 就会被覆盖(即丢失),而此丢失的元素就无法被写入到旋转后的索引位置了。
2024-05-16 09:21:15
326
原创 力扣 轮转数组
例如,假设数组 nums 的长度为 5,如果 k 的值为 7,那么执行 k %= nums.size();后,k 的值将变为 2,因为 7 % 5 = 2。这样就确保了 k 的值在数组长度范围内,避免了数组越界的情况。的作用是将 k 对数组长度取模,即取余操作。这样做的结果是,无论 k 的值是多少,它都会被限制在 0 到 nums.size() - 1(数组长度减一)的范围内。
2024-05-10 11:27:54
215
原创 力扣 56. 合并区间
思路:先将区间的左端点排序,完后维护一个区间,将这个区间的右端点与下一个区间进行比较,如果右端点在下一个区间内,则将这个区间纳入我们维护的区间中,否则,更新我们维护的区间。
2024-05-09 09:14:19
136
原创 力扣热题100 560. 和为 K 的子数组
解释:以数轴为例,这里的j是左端点,i是右端点,这里假设我们固定右端点,问左边的前缀和有多少个等于pre[i]−k,也就是有多少个子集的和等于k。求窗口内数组的和pre[i]−pre[j−1]==k,这里进行改进简单的换位pre[j−1]==pre[i]−k。思路,前缀和+滑动窗口。
2024-05-07 12:55:43
207
原创 三数之和,力扣
参考这位大佬的题解,我们先写了一个求两数之和的函数vector<vector<int>>towSumTarget(vector<int>& nums,int start ,int target)引用求两数之和的与某个值的的函数,遍历数组,将每个值取反,作为求和的目标,放入求两数之和的函数函数里,最后如果满足条件,我们则将这个数压入。因为在数组里有重复的元素,可能会造成重复的结果,比如(1,2),(2,1)我们采用这一步跳过重复的元素。接着求三数之和等于0,具体参考上面那位大佬的题解,这里简单写一下思路。
2024-04-25 12:58:44
156
原创 vector中erase的常见用法
数字3,遇见不是3的元素我们需要跳过其次是迭代器在指向vec.end()的时候,还会进行一次++,这就发生了数组越界,所以我们一概这样修改。但是这种代码也是存在缺陷的,首先是我们。
2024-04-23 17:15:19
904
原创 简单了解C++ lambda表达式
/ 而不是复制一份新的副本。// 后面的是 Lambda表达式,这个表达式有两个参数,返回值为int&// 这里的function是定义了一个函数,两个int变量名字叫bfs。// 进行修改会影响到外部作用域中的原始变量。但是,在这个特定的例子中,// 只是简单地读取并没有修改,所以使用引用还是值传递其实没有太大区别。// 是一个引用运算符,它将 i 和 j 引用到它们各自的值,[ ]里的数字是向前面我们定义好的变量索取的,如果加&,就相当于指针,直接对x进行作用。()里的数字是需要我们手动输入。
2024-04-21 20:51:46
331
1
原创 使矩阵满足条件的最少操作次数,力扣周赛
那么有转移方程f(i + 1, j) = min(f(i + 1, j), f(i, k) + m - cnt[i + 1][j])PS:原本考虑将每列替换成不同的数字会对结果有影响,但看到数据范围较小,就直接便利取最小值。思路,从题可知要求每列的数字一样,相邻列的数字不同数字不同,记cnt[i][j]为原网格第i列中j的出现次数。
2024-04-21 20:33:33
190
1
原创 力扣128.最长连续序列
这个题的思路很简单,将所有数字压入set集合,set集合会自动排序,并且删除多余的数,接着遍历集合,用变量记录最长子序列的长度,上一个数的值,然后比较,看看这个数能否和上一个数构成一个子序列,如果可以,则记数加一,不行则更新记录子序列长度的变量值为1。
2024-04-20 16:32:27
238
1
原创 怎么将力扣的代码在本地运行C++
今天刚玩力扣,发现的提交页面和平常看到的不一样,就很疑惑,查了查资料发现,力扣官网为了让用户更关注代码,自动添加了输入,也就是说,我们不用操心输入的问题,只需要使用class Solution(类解决方案)里的输入变量就行。原文链接:https://blog.youkuaiyun.com/m0_62869178/article/details/128934136。只需要我们定义一个主函数,并且设置一个和函数返回值一样的变量即可,同时别忘了输入的参数。这里参考这位大佬的文章,讲的很详细。怎们将力扣上的代码在本地运行。
2024-04-18 18:00:37
357
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人